3

我有以下内容:

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))

我不确定这是否是最好的方法。我最担心的是我根本没有优化。一些基本的想法是:

  • d 应该在共享内存中(它可以被所有线程访问)。我假设没有线程会访问相同的条目。
  • 每个 (i, key) 组合都应该同时被测试。

如果您认为我应该使用另一种语言,如果您能指出我会很高兴。帮助将不胜感激。提前致谢。

4

2 回答 2

9

Python ( http://docs.python.org/2/library/threading.html ) 中的传统线程在大多数常见运行时中受到“全局解释器锁”(GIL)的限制,它可以防止多个线程同时执行,无论如何您拥有的许多内核或 CPU。尽管有这个限制,但当您的线程受 I/O 限制时,传统线程仍然非常有价值,例如处理网络连接或执行 DB 查询,其中大部分时间它们都在等待外部事件而不是“计算”。

如果您的各个进程受 CPU 限制,例如您的问题所暗示的那样,那么使用较新的“多处理”模块(http://docs.python.org/2/library/multiprocessing.html)会更好:

multiprocessing 是一个使用类似于 threading 模块的 API 支持生成进程的包。multiprocessing 包提供本地和远程并发,通过使用子进程而不是线程来有效地避开全局解释器锁。因此,多处理模块允许程序员充分利用给定机器上的多个处理器。

于 2013-06-08T22:36:55.900 回答
0

您的第二个代码什么都不做,因为 test 的返回值被丢弃了。你的意思是保留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 中提高性能方面毫无用处。许多标准库函数在执行繁重的工作时会释放全局解释器锁。对于这个简单的示例,可能没有并行性。

于 2013-06-08T22:44:41.310 回答