激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python3如何使用多線程提升程序運行速度

Python3如何使用多線程提升程序運行速度

2020-08-11 17:07天外歸云 Python

這篇文章主要介紹了Python3如何使用多線程提升程序運行速度,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

優化前后新老代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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倍

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/LanTianYou/p/11498525.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月天影院,久久综合, | 一区二区三区四区高清视频 | 日韩美香港a一级毛片 | 欧美高清在线精品一区二区不卡 | 在线日韩欧美 | 日韩视频高清 | 草草视频免费 | 中文字幕1区2区 | 精品成人免费 | 双性帝王调教跪撅打屁股 | 成人在线观看免费视频 | 久久久久九九九女人毛片 | 久久久免费观看完整版 | wwwav国产| 免费一级毛片在线播放视频老 | 成人一级视频 | 国产精品成人av片免费看最爱 | 欧美日韩亚洲一区二区三区 | 黄色的视频在线观看 | 成人 在线 | 久久91精品国产91久久yfo | 在线观看日本中文字幕 | 嗯~啊~弄嗯~啊h高潮视频 | 免费黄色欧美视频 | 色999久久久精品人人澡69 | 国产精品久久久久久久四虎电影 | 特级无码毛片免费视频尤物 | 亚洲爱爱网站 | 日韩精品久久久久久 | 色多多视频导航 | 久久精品一二三区白丝高潮 | 久久99精品国产99久久6男男 | 午夜小视频免费观看 | 午夜久| www.com超碰 | 黄色大片网站在线观看 | 一级毛片播放 | 亚洲一区二区三区视频 | 污片视频网站 | 97精品国产高清在线看入口 | 日本欧美在线播放 |