【发布时间】:2021-06-03 23:37:34
【问题描述】:
我有一个数据流来得非常快,当一个新数据到来时,我想根据它进行 6 种不同的计算。 我想尽可能快地进行这些计算,以便在收到新数据后立即更新。 数据可以以毫秒的速度到达,所以我的计算必须非常快。
所以我想到的最好的事情是同时在 6 个不同的线程上进行这些计算。
我以前从来没有用过线程,所以我不知道该放在哪里。
这是描述我的问题的代码
我可以从这里做什么?
import numpy as np
import time
np.random.seed(0)
def calculation_1(data, multiplicator):
r = np.log(data * (multiplicator+1))
return r
start = time.time()
for ii in range(1000000):
data_stream_main = [np.random.uniform(0, 2.0), np.random.uniform(10, 1000.0), np.random.uniform(0, 0.01)]
# calculation that has to be done together
calc_1 = calculation_1(data=data_stream_main[0], multiplicator=2)
calc_2 = calculation_1(data=data_stream_main[0], multiplicator=3)
calc_3 = calculation_1(data=data_stream_main[1], multiplicator=2)
calc_4 = calculation_1(data=data_stream_main[1], multiplicator=3)
calc_5 = calculation_1(data=data_stream_main[2], multiplicator=2)
calc_6 = calculation_1(data=data_stream_main[2], multiplicator=3)
print(calc_1)
print(calc_2)
print(calc_3)
print(calc_4)
print(calc_5)
print(calc_6)
print("total time:", time.time() - start)
【问题讨论】:
-
请注意,Python 中的线程用于并发,而不是并行。线程将有助于加速 I/O 绑定代码,而不是 CPU 绑定代码。即使有适当的并行性,您也必须考虑分支和分支的开销——这对于微秒级的微任务很少有用。如果速度是您的问题,那么通过编译(例如通过 PyPy、Cython、Numba、Nuitka 等)直接提高单线程性能会更合适。
-
你的意思是计算的顺序是随机的,但不会同时进行两次计算?
-
简单来说,是的。线程受GIL 限制,因此只有一个线程可以执行/访问 Python 函数/对象。
标签: python multithreading performance multiprocessing