我有以下内容:
d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers
...
for i in l1:
for key in l2:
#do some stuff
...
if d[key] == i:
print d[key]
我想使用线程(为了提高性能)做同样的事情。我想的是:
import threading
d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers
...
def test(i, key):
#do the same stuff
if d[key] == i:
print d[j]
for i in l1:
for key in l2:
threading.start_new_thread(test, (i,key))
我不确定这是最好的方法。我担心的是,我根本没有优化。一些基本的想法是:
如果您认为我应该使用其他语言,如果您能指出,我会很高兴。 帮助将是ayciated。提前谢谢。
答案 0 :(得分:9)
Python中的传统线程(http://docs.python.org/2/library/threading.html)在大多数常见运行时受到"Global Interpreter Lock" (GIL)的限制,这可以防止多个线程同时执行,无论您拥有多少内核或CPU。尽管存在这种限制,但传统线程在线程受I / O限制时仍然非常有价值,例如处理网络连接或执行数据库查询,其中大多数时候它们都在等待外部事件而不是“计算”。
如果您的个别进程受CPU限制,例如您的问题所隐含的,那么您可以更好地使用较新的“多处理”模块(http://docs.python.org/2/library/multiprocessing.html):
multiprocessing是一个使用a支持产生进程的包 API类似于线程模块。多处理包 提供本地和远程并发,有效地侧面步进 全局解释器锁通过使用子进程而不是线程。 因此,多处理模块允许程序员完全 利用给定机器上的多个处理器。
答案 1 :(得分:0)
你的第二个代码什么都不做,因为测试的返回值被丢弃了。你的意思是保留print d[j]
吗?
除非test(i, j)
实际上比你实现的更复杂,否则你绝对不会优化任何东西,因为启动一个线程所需的时间比访问一个字典要长。你可能会做得更好:
def test(i):
for j in l2:
if d[j] == i:
print d[j]
for i in l1:
threading.start_new_thread(test, (i,))
通常,一些线程可以提高性能,数百个线程只会增加开销。
全局解释器锁不一定使线程无法提高Python的性能。许多标准库函数将在完成繁重工作时释放全局解释器锁。对于这个简单的例子,可能没有并行性。