加快Python脚本的速度或寻找替代方案?

时间:2018-12-24 22:18:50

标签: python

这是我当前的脚本:

import argparse
from pybitcointools import *

parser = argparse.ArgumentParser()
parser.add_argument('filename')
args = parser.parse_args()

with open(args.filename) as textfile:
    for line in textfile:
       priv = sha256(line.rstrip())
       wif_u = encode_privkey(priv, 'wif')
       wif_c = encode_privkey(priv, 'wif_compressed')
       addr_u = pubtoaddr(privtopub(priv))
       addr_c = pubtoaddr(compress(privtopub(priv)))
       print("%s,%s" % (addr_u, wif_u))
       print("%s,%s" % (addr_c, wif_c))

我运行此脚本将1000行转换为2000个比特币大脑钱包(1000 x 2包括压缩和未压缩的)。运行需要12.5秒。

如果我删除这些行,它将从12.5秒降低到0.2秒:

addr_u = pubtoaddr(privtopub(priv))
addr_c = pubtoaddr(compress(privtopub(priv)))

但是,当然,我需要地址,而不仅仅是WIF格式的私钥。

这是我要弄清楚的三件事:

  1. 为什么地址生成要比私钥生成花费更长的时间?

  2. 是否有一种方法可以加快现有Python脚本的运行时间,使其在一秒钟之内?

  3. 如果没有,没有人知道一个简单的方法可以更快地做到这一点吗?

我不介意使用Python,Perl,C,无论做什么工作,而且速度最快。

1 个答案:

答案 0 :(得分:1)

您两次致电privtopub(priv)。这样可以保存对fast_multiply的调用,这可能是整个程序中最慢的功能。

我建议先做:

pub = privtopub(priv)
addr_u = pubtoaddr(pub)
addr_c = pubtoaddr(compress(pub))

然后我建议使用multiprocessing.Pool

import argparse
from pybitcointools import *

def convert(line):
    priv = sha256(line.rstrip())
    wif_u = encode_privkey(priv, 'wif')
    wif_c = encode_privkey(priv, 'wif_compressed')
    pub = privtopub(priv)
    addr_u = pubtoaddr(pub)
    addr_c = pubtoaddr(compress(pub))
    return (addr_u, wif_u, addr_c, addr_u)

if __name__=="__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('filename')
    args = parser.parse_args()

    pool = multiprocessing.Pool()

    with open(args.filename) as textfile:
        for addr_u, wif_u, addr_c, addr_u in pool.imap(convert, textfile):
            print("%s,%s" % (addr_u, wif_u))
            print("%s,%s" % (addr_c, wif_c))