多线程Python应用程序比单线程实现慢



我编写这个程序是为了正确地学习如何使用多线程。我想在我自己的程序中实现类似的东西:

import numpy as np
import time
import os
import math
import random
from threading import Thread
def powExp(x, r):
for c in range(x.shape[1]):
x[r][c] = math.pow(100, x[r][c])
def main():
print()
rows = 100
cols = 100
x = np.random.random((rows, cols))
y = x.copy()

start = time.time()
threads = []
for r in range(x.shape[0]):
t = Thread(target = powExp, args = (x, r))
threads.append(t)
t.start()
for t in threads:
t.join()
end = time.time()
print("Multithreaded calculation took {n} seconds!".format(n = end - start))
start = time.time()
for r in range(y.shape[0]):
for c in range(y.shape[1]):
y[r][c] = math.pow(100, y[r][c])
end = time.time()
print("Singlethreaded calculation took {n} seconds!".format(n = end - start))
print()
randRow = random.randint(0, rows - 1)
randCol = random.randint(0, cols - 1)
print("Checking random indices in x and y:")
print("x[{rR}][{rC}]: = {n}".format(rR = randRow, rC = randCol, n = x[randRow][randCol]))
print("y[{rR}][{rC}]: = {n}".format(rR = randRow, rC = randCol, n = y[randRow][randCol]))
print()
for r in range(x.shape[0]):
for c in range(x.shape[1]):
if(x[r][c] != y[r][c]):
print("ERROR NO WORK WAS DONE")
print("x[{r}][{c}]: {n} == y[{r}][{c}]: {ny}".format(
r = r,
c = c,
n = x[r][c],
ny = y[r][c]
))
quit()
assert(np.array_equal(x, y))
if __name__ == main():
main()

从代码中可以看出,这里的目标是通过为每列创建一个线程来并行化math.pow(100,x[r][c])操作。然而,这段代码非常慢,比单线程版本慢得多。

输出:

Multithreaded calculation took 0.026447772979736328 seconds!
Singlethreaded calculation took 0.006798267364501953 seconds!
Checking random indices in x and y:
x[58][58]: = 9.792315687115973
y[58][58]: = 9.792315687115973

我搜索了stackoverflow,发现了一些关于GIL强制python字节码只能在单个内核上执行的信息。然而,我不确定这实际上是限制我并行化的原因。我尝试使用池而不是线程来重新排列并行化的for循环。似乎什么都不起作用。

线程降低Python代码性能

编辑:此线程讨论相同的问题。在python中使用多线程是不是因为GIL而完全不可能提高性能?是GIL导致我的速度减慢吗?

第2版(2017-01-18):因此,根据我在网上搜索了很多内容后收集到的信息,python似乎真的不利于并行性。我想做的是将tensorflow中实现的神经网络中使用的python函数并行化。。。似乎添加一个自定义操作是可行的。

这里的问题数量相当。。。很多的太多(系统!)线程做的工作太少,GIL等等。这就是我认为的Python中并行性的一个非常好的介绍:

https://www.youtube.com/watch?v=MCs5OvhV9S4

实时编码非常棒。

相关内容

  • 没有找到相关文章

最新更新