【问题标题】:Python Multiprocessing not making it fasterPython多处理并没有让它更快
【发布时间】:2018-01-05 20:59:11
【问题描述】:

您好,我有一个程序从标准输入获取输入,我认为如果我使用多处理会更快,但实际上需要更长的时间:

正常:

import sys
import hashlib
import base58
from progress.bar import ShadyBar


bar=ShadyBar('Fighting', max=100000, suffix='%(percent)d%% - %(index)d / %(max)d - %(elapsed)d')

listagood=[]
for cc in sys.stdin:
    try:
        bar.next()
        hexwif=cc[0:51]         
        enco=base58.b58decode_check(hexwif)     
        Fhash=hashlib.sha256(enco)          
        d2=hashlib.sha256() 
        d2.update(Fhash.digest())
        Shash=d2.hexdigest() 
        Conf1=Shash[0:8] 
        encooo=base58.b58decode(hexwif) 
        Conf2=encooo.encode("hex")
        Conf2=Conf2[len(Conf2)-8:len(Conf2)]
        if Conf1==Conf2:
            listagood.append(cc)
    except:
        pass



bar.finish()
print("\nChecksum: " )
print(listagood)
print("\n")

多处理:

def worker(line):
    try:
        hexwif=line[0:51]       
        enco=base58.b58decode_check(hexwif)
        Fhash=hashlib.sha256(enco)          
        d2=hashlib.sha256() 
        d2.update(Fhash.digest())
        Shash=d2.hexdigest()
        Conf1=Shash[0:8]
        encooo=base58.b58decode(hexwif)
        Conf2=encooo.encode("hex")
        Conf2=Conf2[len(Conf2)-8:len(Conf2)]
        if Conf1==Conf2:
            return(line)
    except:
        #e=sys.exc_info()
        #print(str(e))
        pass



listagood=[]
pool = multiprocessing.Pool(processes=4)
bar=ShadyBar('Fighting', max=100000, suffix='%(percent)d%% - %(index)d / %(max)d - %(elapsed)d')
for result in pool.imap(worker, sys.stdin):
    if result != None:
        listagood.append(result)
    #print "Result: %r" % (result)
    bar.next()


bar.finish()
print("\nChecksum: " )
print(listagood)
print("\n")

不幸的是,当我检查经过的时间时,它几乎是多进程的三倍。

我有一个处理器、两个物理核心,每个物理核心有 2 个虚拟核心。

我怎么知道这是否是由多处理开销引起的?还是我做错了什么?

任何帮助将不胜感激

【问题讨论】:

    标签: python multiprocessing progress-bar stdin


    【解决方案1】:

    池将输入划分为多个进程。在您的情况下 4。但是您一次传递一个输入,实际上并没有触发所有 4 个线程。 使用下面的,看看时间的变化

     pool.imap(worker, sys.stdin.readlines())
    

    希望这会有所帮助。

    【讨论】:

    • 我会试试的,我仍然理解这个多处理是如何工作的,感谢您的评论,我会尽快回复结果
    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多