![](/img/trans.png)
[英]What should I use to speed up this code? (Multiprocessing vs Multithreading)
[英]how to use Multithreading in python and speed up code
我正在嘗試在python 3中使用多線程,以加快某些代碼的執行速度。
基本上我必須在迭代器上運行相同的功能
channels=range(1,8)
我已經給出了到目前為止我正在使用的示例。 我正在測試它是否正常執行
我看不出任何重大差異。 也許我做錯了。
一點幫助將不勝感激
#!/usr/bin/env python
from threading import Thread
import matplotlib.pyplot as plt
import pdb
# from multiprocessing.dummy import Pool as ThreadPool
from multiprocessing.pool import ThreadPool
import threading
import argparse
import logging
from types import SimpleNamespace
import numpy as np
import time
import inspect
import logging
logger = logging.getLogger(__name__)
myself = lambda: inspect.stack()[1][3]
logger = logging.getLogger(__name__)
pool = ThreadPool(processes=8)
class ThreadWithReturnValue(Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs={}, Verbose=None):
Thread.__init__(self, group, target, name, args, kwargs)
self._return = None
def run(self):
print(type(self._target))
if self._target is not None:
self._return = self._target(*self._args,
**self._kwargs)
def join(self, *args):
Thread.join(self, *args)
return self._return
#--------
def map_kg1_efit(data,chan):
density = np.zeros(968)
for it in range(0,data.ntefit):
density[it] = it
for jj in range(0,data.ntkg1v):
density[it]=density[it]+jj
data.KG1LH_data.lid[chan] = density
# ----------------------------
def main():
data = SimpleNamespace()
data.KG1LH_data = SimpleNamespace()
data.ntkg1v = 30039
data.ntefit = 968
data.KG1LH_data.lid = [ [],[],[],[],[],[],[],[]]
channels=range(1,8)
# chan =1
for chan in channels:
logger.info('computing channel {}'.format(chan))
start_time = time.time()
twrv = ThreadWithReturnValue(target=map_kg1_efit, args=(data,chan))
# pdb.set_trace()
twrv.start()
twrv.join()
logger.info("--- {}s seconds ---".format((time.time() - start_time)))
plt.figure()
plt.plot(range(0,data.ntefit), data.KG1LH_data.lid[chan])
plt.show()
logger.info('computing channel {}'.format(chan))
start_time = time.time()
map_kg1_efit(data,chan)
logger.info("--- {}s seconds ---".format((time.time() - start_time)))
plt.figure()
plt.plot(range(0,data.ntefit), data.KG1LH_data.lid[chan])
plt.show()
logger.info("\n Finished.\n")
if __name__ == "__main__":
debug_map = {0: logging.ERROR,
1: logging.WARNING,
2: logging.INFO,
3: logging.DEBUG,
4: 5}
logging.basicConfig(level=debug_map[2])
logging.addLevelName(5, "DEBUG_PLUS")
logger = logging.getLogger(__name__)
# Call the main code
main()
對於此與CPU綁定的任務,您可以使用multiprocessing.pool.Pool
獲得並行性。 這是一個簡化的示例,它使系統中的所有四個內核都飽和:
import matplotlib.pyplot as plt
from multiprocessing.pool import Pool
from types import SimpleNamespace
import numpy as np
def map_kg1_efit(arg):
data = arg[0]
chan = arg[1]
density = np.zeros(968)
for it in range(0,data.ntefit):
density[it] = it
for jj in range(0,data.ntkg1v):
density[it]=density[it]+jj
data.KG1LH_data.lid[chan] = density
return (data, chan)
if __name__ == "__main__":
data = SimpleNamespace()
data.KG1LH_data = SimpleNamespace()
data.ntkg1v = 30039
data.ntefit = 968
data.KG1LH_data.lid = [ [],[],[],[],[],[],[],[]]
with Pool(4) as pool:
results = pool.map(map_kg1_efit, [(data, chan) for chan in range(1, 8)])
for r in results:
plt.figure()
plt.plot(range(0,r[0].ntefit), r[0].KG1LH_data.lid[r[1]])
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.