我正在尝试将2 ^ 82589933相乘,但是在python上运行它非常非常非常慢。它已经运行了将近3天,通过计算甚至还不到40%,并且显然正在以指数级的速度下降。作为python新手,我不知道如何加快速度。我尝试了多线程,但是我看不到多线程简单乘法的合理方法。感谢您的帮助。
import datetime
intg = 2
exp = 82589933
x = 0
for i in range(exp):
intg = (intg * 2)
x = x + 1
if x == 100000:
x = 0
print(((i/exp)*100),'% - @',(datetime.datetime.now().time()))
with open("log.txt", "a") as f:
f.truncate(0)
f.write(str(intg))
f.write('\n')
f.write(str(i))
with open("log.txt", "a") as f:
f.truncate(0)
f.write(str(intg))
f.write('\n')
f.write(str(i))
答案 0 :(得分:0)
不知道为什么使用包含2500万个十进制数字的文本文件会很有用,但是该过程唯一耗时的部分是将整数转换为字符串。实际的乘法非常快,即使在我动力不足的笔记本上:
In [11]: %time result = 2**82589933
Wall time: 752 ms
Python内置的将int转换为字符串的实用程序相当不错,但是在这种规模下却很慢。在我的机器上,我们可以粗略估算出将int转换为可以写出的字符串需要花费4-5个小时:
In [13]: %time result = 10**10000; s = str(result)
Wall time: 2.99 ms
In [14]: %time result = 10**100000; s = str(result)
Wall time: 245 ms
In [15]: %time result = 10**1000000; s = str(result)
Wall time: 24.3 s
In [16]: 24.3 * (25**2) / 3600
Out[16]: 4.21875
一种改善方法的方法是使用第三方库,该库具有更快的int-to-string功能,例如gmpy2:
In [17]: import gmpy2
In [18]: %time r2 = gmpy2.mpz(2)**82589933
Wall time: 7.98 ms
In [19]: %time s = str(r2)
Wall time: 45.6 s
In [20]: s[:10]
Out[20]: '1488944457'
In [21]: len(s)
Out[21]: 24862048
看起来不错:
In [23]: gmpy2.mpfr(2)**82589933
Out[23]: mpfr('1.4889444574204133e+24862047')
但是,再说一遍,您将其写入文本文件。接下来是什么?我们无法轻松地对文本文件进行算术运算,并且由于该数字的唯一值得注意的地方是它紧靠Mersenne素数2 ^ 282,589,933-1,所以您对使用数字本身更感兴趣吗?对我来说,序列化似乎不是很有趣,但是YMMV。
答案 1 :(得分:-2)
在Python中,要执行数字幂运算,可以使用**
运算符。因此,您无需编写自己的代码:只需键入2**82589933
。
但是,2 ^ 82589933的结果等于一个非常高的数字,具有数千个数字,因此计算机将花费大量时间才能获得结果。以下数字是2 ^ 10000的结果,因此请想象2 ^ 82589933将持续多长时间。
1995063116880758384883742162683585083823496831886192454852008949852943883022194663191996168403619459789933112942320912427155649134941378111759378593209632395785573004679379452676524655126605989552055008691819331154250860846061810468550907486608962488809048989483800925394163325785062156830947390255691238806522509664387444104675987162698545322286853816169431577562964076283688076073222853509164147618395638145896946389941084096053626782106462142733339403652556564953060314268023496940033593431665145929777327966577560617258203140799419817960737824568376228003730288548725190083446458145465055792960141483392161573458813925709537976911927780082695773567444412306201875783632550272832378927071037380286639303142813324140162419567169057406141965434232463880124885614730520743199225961179625013099286024170834080760593232016126849228849625584131284406153673895148711425631511108974551420331382020293164095759646475601040584584156607204496286701651506192063100418642227590867090057460641785695191145605 5068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241 0374914109667185570507590981002467898801782719259533812824219540283027594084489550146766683896979968862416363133763939033734558014076367418777110553842257394991101864682196965816514851304942223699477147630691554682176828762003627772577237813653316111968112807926694818872012986436607685516398605346022978715575179473852463694469230878942659482170080511203223654962881690357391213683383935917564187338505109702716139154395909915981546544173363116569360311222499379699992267817323580231118626445752991357581750081998392362846152498810889602322443621737716180863570154684840586223297928538756234865564405369626220189635710288123615675125433383032700290976686505685571575055167275188991941297113376901499161813151715440077286505731895574509203301853048471138183154073240533190384620840364217637039115506397890007428536721962809034779745333204683687958685802379522186291200807428195513179481576244482985184615097048880272747215746881315947504097321150804981904558034168269497871413160632106863915116817743 04792596709376