python中for循环加速_如何提高python 中for循环的效率[通俗易懂]

python中for循环加速_如何提高python 中for循环的效率[通俗易懂]对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?思路很简单:就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中。但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。因此,需要使用并行…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

python中for循环加速_如何提高python 中for循环的效率[通俗易懂]

对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?

思路很简单:

就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中。

但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。

因此,需要使用并行进行for循环的技巧:

由于3000万数据放到csv中导致csv打不开,因此我就把一个csv通过split软件将其切分成每份60万,共53个csv。

我原来的思路是读取文件夹,获取由每一个60万的csv文件组成的列表,再分别对每一个60万的csv进行处理。实质上还是循环33210000次,并行for循环就是同时处理几个60万的csv文件,就能成倍的减少时间消耗。

并行进行for循环是受下面的方法启发:

我之前的做法类似这样:

words = [“apple”, “bananan”, “cake”, “dumpling”]

for word in words:

print word

并行for循环类似这样:

from multiprocessing.dummy import Pool as ThreadPool

items = list()

pool = ThreadPool()

pool.map(process, items)

pool.close()

pool.join()

其中,process是进行处理的函数

实例代码如下:

# -*- coding: utf-8 -*-

import time

from multiprocessing.dummy import Pool as ThreadPool

def process(item):

print(“正在并行for循环”)

print(item)

time.sleep(5)

items = [“apple”, “bananan”, “cake”, “dumpling”]

pool = ThreadPool()

pool.map(process, items)

pool.close()

pool.join()

补充知识:Python3用多线程替代for循环提升程序运行速度

优化前后新老代码如下:

from git_tools.git_tool import get_collect_projects, QQNews_Git

from threading import Thread, Lock

import datetime

base_url = “http://git.xx.com”

project_members_commits_lang_info = {}

lock = Lock()

threads = []

“””

Author:zenkilan

“””

def count_time(func):

def took_up_time(*args, **kwargs):

start_time = datetime.datetime.now()

ret = func(*args, **kwargs)

end_time = datetime.datetime.now()

took_up_time = (end_time – start_time).total_seconds()

print(f”{func.__name__} execution took up time:{took_up_time}”)

return ret

return took_up_time

def get_project_member_lang_code_lines(git, member, begin_date, end_date):

global project_members_commits_lang_info

global lock

member_name = member[“username”]

r = git.get_user_info(member_name)

if not r[“id”]:

return

user_commits_lang_info = git.get_commits_user_lang_diff_between(r[“id”], begin_date, end_date)

if len(user_commits_lang_info) == 0:

return

lock.acquire()

project_members_commits_lang_info.setdefault(git.project, dict())

project_members_commits_lang_info[git.project][member_name] = user_commits_lang_info

lock.release()

def get_project_lang_code_lines(project, begin_date, end_date):

global threads

git = QQNews_Git(project[1], base_url, project[0])

project_members = git.get_project_members()

if len(project_members) == 0:

return

for member in project_members:

thread = Thread(target=get_project_member_lang_code_lines, args=(git, member, begin_date, end_date))

threads.append(thread)

thread.start()

@count_time

def get_projects_lang_code_lines(begin_date, end_date):

“””

获取项目代码行语言相关统计――新方法(提升效率)

应用多线程替代for循环

并发访问共享外部资源

:return:

“””

global project_members_commits_lang_info

global threads

for project in get_collect_projects():

thread = Thread(target=get_project_lang_code_lines, args=(project, begin_date, end_date))

threads.append(thread)

thread.start()

@count_time

def get_projects_lang_code_lines_old(begin_date, end_date):

“””

获取项目代码行语言相关统计――老方法(耗时严重)

使用最基本的思路进行编程

双层for循环嵌套并且每层都包含耗时操作

:return:

“””

project_members_commits_lang_info = {}

for project in get_collect_projects():

git = QQNews_Git(project[1], base_url, project[0])

project_members = git.get_project_members()

user_commits_lang_info_dict = {}

if len(project_members) == 0:

continue

for member in project_members:

member_name = member[“username”]

r = git.get_user_info(member_name, debug=False)

if not r[“id”]:

continue

try:

user_commits_lang_info = git.get_commits_user_lang_diff_between(r[“id”], begin_date, end_date)

if len(user_commits_lang_info) == 0:

continue

user_commits_lang_info_dict[member_name] = user_commits_lang_info

project_members_commits_lang_info[git.project] = user_commits_lang_info_dict

except:

pass

return project_members_commits_lang_info

def test_results_equal(resultA, resultB):

“””

测试方法

:param resultA:

:param resultB:

:return:

“””

print(resultA)

print(resultB)

assert len(str(resultA)) == len(str(resultB))

if __name__ == “__main__”:

from git_tools.config import begin_date, end_date

get_projects_lang_code_lines(begin_date, end_date)

for t in threads:

t.join()

old_result = get_projects_lang_code_lines_old(begin_date, end_date)

test_results_equal(old_result, project_members_commits_lang_info)

老方法里外层for循环和内层for循环里均存在耗时操作:

1)git.get_project_members()

2)git.get_user_info(member_name, debug=False)

分两步来优化,先里后外或先外后里都行。用多线程替换for循环,并发共享外部资源,加锁避免写冲突。

测试结果通过,函数运行时间装饰器显示(单位秒):

get_projects_lang_code_lines execution took up time:1.85294

get_projects_lang_code_lines_old execution took up time:108.604177

速度提升了约58倍

以上这篇如何提高python 中for循环的效率就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170067.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • mysql自定义函数详解_mysql自定义函数详解

    mysql自定义函数详解_mysql自定义函数详解需求:对于数据库中的记录,如果有两条连续的数据的value字段的值相同,则发邮件通知相关人员。需求分析:告警系统里面的告警检查是通过SQL来进行的,一般的SQL实现不了此功能,因此,这里可以通过函数的方式来实现。具体实现如下:1、数据表准备:tb_config_record。新建数据表脚本如下:createtabletb_config_record(idint,statusvarch…

    2022年9月7日
  • 电脑关闭445端口_计算机端口在哪里设置

    电脑关闭445端口_计算机端口在哪里设置win7关闭445端口命令是什么?在我们使用的windows7旗舰版操作系统中默认开启了445端口,这个端口会遭到病毒的攻击,所以我们需要将其关闭。本文中winwin7小编给大家分享介绍下使用cmd命令提示符来关闭445端口的详细操作方法,有需要的用户快参考下面步骤来设置关闭445端口吧!455端口关闭教程:1、首先我们来看看当前系统都开放了那些端口,使用快捷键Win+R调出运行窗口,输入cmd…

    2022年10月9日
  • Linux安装Redis(图文解说详细版)「建议收藏」

    Linux安装Redis(图文解说详细版)「建议收藏」最近开个新坑,就是在linux环境中操作开发环境,带大家玩转Linux,会整理出一篇Linux的专栏,欢迎大家订阅!!富贵同学linux环境为CentOS7.8版本。这次说一下Redis的安装第一步,下载安装包https://redis.io/download第二步,上传安装包到/opt下(老规矩了,安装包在opt下)第三步,解压安装包tar-zxvfredis-6.2.6.tar.gz第四步,编译进入到reidis-6.2.6中输入make进行编译第五步,安装进入s

    2022年6月20日
  • kettle下载安装使用教程

    kettle下载安装使用教程Kettle简介Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行, 数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两…

    2022年5月24日
  • 路由器04–OPKG

    路由器04–OPKG1.简介https://oldwiki.archive.openwrt.org/doc/techref/opkgOpkg是一个基于ipkg的轻量级的软件包管理系统,主要用于嵌入式系统,目前应用opkg的有OpenWRT和OpenEmbedded。1Opkg的详细使用方法可以参考OpenWRT的WIKI页面,不再赘述,本文将重点解释opkg的工作原理。…

    2022年5月20日
  • Stata Kendall 相关系数作图

    Stata Kendall 相关系数作图StataKendall相关系数作图回答Superficial.的问题,测试CSDN的markdown发帖功能如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入此帖目的有二:回答Superficial.的问题,测试CSDN的markdown发帖功能如何插入一段漂亮的代码片去博客设置页面,选择

    2022年6月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号