国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

如何提高python 中for循環(huán)的效率

瀏覽:3日期:2022-07-30 09:04:14

對于某個城市的出租車數(shù)據(jù),一天就有33210000條記錄,如何將每輛車的數(shù)據(jù)單獨拎出來放到一個專屬的文件中呢?

思路很簡單:

就是循環(huán)33210000條記錄,將每輛車的數(shù)據(jù)搬運到它該去的文件中。

但是對于3000多萬條數(shù)據(jù),一個一個循環(huán)太消耗時間,我花了2個小時才搬運了60萬數(shù)據(jù),算算3000萬我需要花費100個小時,也就需要4-5天。并且還需要保證這五天全天開機,不能出現(xiàn)卡機的事故。

因此,需要使用并行進行for循環(huán)的技巧:

由于3000萬數(shù)據(jù)放到csv中導(dǎo)致csv打不開,因此我就把一個csv通過split軟件將其切分成每份60萬,共53個csv。

我原來的思路是讀取文件夾,獲取由每一個60萬的csv文件組成的列表,再分別對每一個60萬的csv進行處理。實質(zhì)上還是循環(huán)33210000次,并行for循環(huán)就是同時處理幾個60萬的csv文件,就能成倍的減少時間消耗。

并行進行for循環(huán)是受下面的方法啟發(fā):

我之前的做法類似這樣:

words = [’apple’, ’bananan’, ’cake’, ’dumpling’] for word in words: print word

并行for循環(huán)類似這樣:

from multiprocessing.dummy import Pool as ThreadPoolitems = list()pool = ThreadPool()pool.map(process, items)pool.close()pool.join()

其中,process是進行處理的函數(shù)

實例代碼如下:

# -*- coding: utf-8 -*-import timefrom multiprocessing.dummy import Pool as ThreadPooldef process(item): print(’正在并行for循環(huán)’) print(item) time.sleep(5)items = [’apple’, ’bananan’, ’cake’, ’dumpling’]pool = ThreadPool()pool.map(process, items)pool.close()pool.join()

補充知識:Python3用多線程替代for循環(huán)提升程序運行速度

優(yōu)化前后新老代碼如下:

from git_tools.git_tool import get_collect_projects, QQNews_Gitfrom threading import Thread, Lockimport datetimebase_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_timedef 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_timedef get_projects_lang_code_lines(begin_date, end_date): ''' 獲取項目代碼行語言相關(guān)統(tǒng)計——新方法(提升效率) 應(yīng)用多線程替代for循環(huán) 并發(fā)訪問共享外部資源 :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_timedef get_projects_lang_code_lines_old(begin_date, end_date): ''' 獲取項目代碼行語言相關(guān)統(tǒng)計——老方法(耗時嚴(yán)重) 使用最基本的思路進行編程 雙層for循環(huán)嵌套并且每層都包含耗時操作 :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: continueuser_commits_lang_info_dict[member_name] = user_commits_lang_infoproject_members_commits_lang_info[git.project] = user_commits_lang_info_dict except:pass return project_members_commits_lang_infodef 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循環(huán)和內(nèi)層for循環(huán)里均存在耗時操作:

1)git.get_project_members()

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

分兩步來優(yōu)化,先里后外或先外后里都行。用多線程替換for循環(huán),并發(fā)共享外部資源,加鎖避免寫沖突。

測試結(jié)果通過,函數(shù)運行時間裝飾器顯示(單位秒):

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循環(huán)的效率就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 精品免费久久久久久成人影院 | 成人69视频在线观看免费 | 国产亚洲精品久久久久久久 | 日韩美女大全视频在线 | 美美女高清毛片视频黄的一免费 | 97久久天天综合色天天综合色 | 男女在线免费视频 | 国产深夜福利在线观看网站 | 亚洲精品久久久久久久福利 | 特黄特色一级特色大片中文 | 国产成人免费午夜在线观看 | 加勒比色综合久久久久久久久 | 欧美成人高清手机在线视频 | 午夜欧美日韩在线视频播放 | 亚洲欧美日韩在线播放 | 欧美特黄一级视频 | 久久久久久久综合 | 亚洲国产高清在线精品一区 | japanese日本tube色系 | 精品国产免费一区二区三区 | 韩国主播19福利视频在线 | 国产成人三级经典中文 | 免费国产一级特黄久久 | 欧美激情一区二区三区高清视频 | 永久精品免费影院在线观看网站 | 亚洲视频在线观看 | 狠狠色狠狠综合久久 | 国产三级在线视频观看 | 成人自拍视频在线 | 成人入口| 欧美日韩视频在线第一区二区三区 | 97免费视频观看 | 日韩欧美久久一区二区 | 国内精品久久久久久久影视麻豆 | 美国一级大黄香蕉片 | 亚洲一区二区三区免费看 | 国产片自拍 | 亚洲综合色吧 | 国产uv1区二区三区 国产va免费精品高清在线观看 | 亚洲美女综合网 | 国产美女主播一级成人毛片 |