为了账号安全,请及时绑定邮箱和手机立即绑定

Python线程问题

Python线程问题

蝴蝶不菲 2021-03-20 10:15:27
我有类似以下内容:d = {...} #a dictionary with stringsl1 = [...] #a list with stuffl2 = [...] #a list with numbers...for i in l1:    for key in l2:        #do some stuff        ...        if d[key] == i:            print d[key]我想使用线程做同样的事情(以提高性能)。我在想类似的东西:import threadingd = {...} #a dictionary with stringsl1 = [...] #a list with stuffl2 = [...] #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,键)组合都应同时进行测试。如果您认为我应该使用另一种语言,那么如果您能指出它将会很高兴。帮助将不胜感激。提前致谢。
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超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的性能。许多标准库函数在执行繁重的工作时会释放全局解释器锁。对于这个简单的例子,虽然可能没有并行性。


查看完整回答
反对 回复 2021-03-31
  • 3 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号