有没有提高python中“str(bigint)”和“print bigint”的性能?打印大整数值需要花费大量时间。我尝试使用以下递归技术:
def p(x,n):
if n < 10:
sys.stdout.write(str(x))
return
n >>= 1
l = 10**n
k = x/l
p(k,n)
p(x-k*l,n)
n =位数, x = bigint
但是,对于某些子调用中的x具有前导零的情况,该方法会失败。有没有替代它或任何更快的方法。 (请不要建议使用任何外部模块或库。)
答案 0 :(得分:1)
从Python整数到字符串的转换运行O(n ^ 2),其中n是数字的长度。对于足够大的数字,它会很慢。对于1,000,001位数字,str()在我的计算机上大约需要24秒。
如果您确实需要将非常大的数字转换为字符串,则递归算法是一种很好的方法。
以下版本的递归代码应该有效:
def p(x,n=0):
if n == 0:
n = int(x.bit_length() * 0.3)
if n < 100:
return str(x)
n >>= 1
l = 10**n
a,b = divmod(x, l)
upper = p(a,n)
lower = p(b,n).rjust(n, "0")
return upper + lower
它会自动估算输出中的位数。对于1,000,001位数字,它大约快4倍。
如果你需要更快,你可能需要使用外部库。
答案 1 :(得分:0)
对于交互式应用程序,内置的print
和str
函数会在眨眼间运行。
>>> print(2435**356)
392312129667763499898262143039114894750417507355276682533585134425186395679473824899297157270033375504856169200419790241076407862555973647354250524748912846623242257527142883035360865888685267386832304026227703002862158054991819517588882346178140891206845776401970463656725623839442836540489638768126315244542314683938913576544051925370624663114138982037489687849052948878188837292688265616405774377520006375994949701519494522395226583576242344239113115827276205685762765108568669292303049637000429363186413856005994770187918867698591851295816517558832718248949393330804685089066399603091911285844172167548214009780037628890526044957760742395926235582458565322761344968885262239207421474370777496310304525709023682281880997037864251638836009263968398622163509788100571164918283951366862838187930843528788482813390723672536414889756154950781741921331767254375186751657589782510334001427152820459605953449036021467737998917512341953008677012880972708316862112445813219301272179609511447382276509319506771439679815804130595523836440825373857906867090741932138749478241373687043584739886123984717258259445661838205364797315487681003613101753488707273055848670365977127506840194115511621930636465549468994140625
>>> str(2435**356)
'392312129667763499898262143039114894750417507355276682533585134425186395679473824899297157270033375504856169200419790241076407862555973647354250524748912846623242257527142883035360865888685267386832304026227703002862158054991819517588882346178140891206845776401970463656725623839442836540489638768126315244542314683938913576544051925370624663114138982037489687849052948878188837292688265616405774377520006375994949701519494522395226583576242344239113115827276205685762765108568669292303049637000429363186413856005994770187918867698591851295816517558832718248949393330804685089066399603091911285844172167548214009780037628890526044957760742395926235582458565322761344968885262239207421474370777496310304525709023682281880997037864251638836009263968398622163509788100571164918283951366862838187930843528788482813390723672536414889756154950781741921331767254375186751657589782510334001427152820459605953449036021467737998917512341953008677012880972708316862112445813219301272179609511447382276509319506771439679815804130595523836440825373857906867090741932138749478241373687043584739886123984717258259445661838205364797315487681003613101753488707273055848670365977127506840194115511621930636465549468994140625'
但是,如果要打印大整数(标准输出,比如说),以便可以通过其他进程读取(从标准输入),并且您发现影响整体性能的二进制到十进制操作,则可以看看Is there a faster way to convert an arbitrary large integer to a big endian sequence of bytes?(虽然接受的答案表明numpy,这是一个外部图书馆,但还有其他建议)。