更新:为了节省您的时间,我直接在这里给出答案。如果你使用纯Python编写代码, Python不能同时利用多CPU核心。但是Python在调用一些用C编写的函数或包时可以同时利用多核,例如Numpy等。
我听说“ Python中的多线程并不是真正的多线程,因为有GIL ”。我还听说“ Python多线程可以处理IO密集型任务而不是计算密集型任务,因为只有一个线程同时运行”。
但我的经历让我重新思考这个问题。我的经验表明,即使对于计算密集型任务,Python 多线程也可以几乎很快地加速计算。(在使用多线程之前,运行以下程序花费了 300 秒,使用多线程之后,花费了 100 秒。)
python
下图显示,使用CPython
package编译器创建了5个线程threading
,几乎cpu cores
都是100%的百分比。
我认为截图可以证明5个cpu核心同时运行。
那么有人可以给我解释吗?我可以在 python 中应用多线程来执行计算密集型任务吗?或者在Python中可以同时运行多线程/核心吗?
我的代码:
import threading
import time
import numpy as np
from scipy import interpolate
number_list = list(range(10))
def image_interpolation():
while True:
number = None
with threading.Lock():
if len(number_list):
number = number_list.pop()
if number is not None:
# Make a fake image - you can use yours.
image = np.ones((20000, 20000))
# Make your orig array (skipping the extra dimensions).
orig = np.random.rand(12800, 16000)
# Make its coordinates; x is horizontal.
x = np.linspace(0, image.shape[1], orig.shape[1])
y = np.linspace(0, image.shape[0], orig.shape[0])
# Make the interpolator function.
f = interpolate.interp2d(x, y, orig, kind='linear')
else:
return 1
workers=5
thd_list = []
t1 = time.time()
for i in range(workers):
thd = threading.Thread(target=image_interpolation)
thd.start()
thd_list.append(thd)
for thd in thd_list:
thd.join()
t2 = time.time()
print("total time cost with multithreading: " + str(t2-t1))
number_list = list(range(10))
for i in range(10):
image_interpolation()
t3 = time.time()
print("total time cost without multithreading: " + str(t3-t2))
输出是:
total time cost with multithreading: 112.71922039985657
total time cost without multithreading: 328.45561170578003
慕森王
四季花海
相关分类