优化一个简单的Python脚本来计算大二的梦想号
Optimization of a simple Python script to calculate the first sophomore's dream number
我目前正在编写一个程序来计算大二的第一个梦想常数 I1 的 100,000 位。它由下面的总和给出。
在这个系列的大约 10,000 个术语之后,它变得相当慢。我选择把程序写得这么小,因为我想看看我能把它写多小
from decimal import *
def sophodream(a):
s,i,t=0,1,int(a*1.5)
while i<t:
print(i)
n,d=Decimal(pow(-1,i+1)),Decimal(i**i)
f=n/d
s+=f
i+=1
return s
我想知道除了 multithreading/multiprocessing 之外是否还有任何方法可以加快速度。我发现当我在螺纹件中做这些系列时,它们的准确性会降低。
可以对您的代码进行一些小的更改/简化,但正如已经指出的那样,您(有时)正在处理一些 非常 的大数字。
from decimal import getcontext, Decimal
def sophodream(a):
s, p = 0, 1
getcontext().prec = a
for i in range(1, int(a * 1.5)):
s += p / Decimal(i**i)
p = -p
return s
print(sophodream(100))
输出:
0.7834305107121344070592643865269754694076819901469309582554178227016001845891404456248642049722689389
显然只是一个非常简短的版本来证明功能
我目前正在编写一个程序来计算大二的第一个梦想常数 I1 的 100,000 位。它由下面的总和给出。
在这个系列的大约 10,000 个术语之后,它变得相当慢。我选择把程序写得这么小,因为我想看看我能把它写多小
from decimal import *
def sophodream(a):
s,i,t=0,1,int(a*1.5)
while i<t:
print(i)
n,d=Decimal(pow(-1,i+1)),Decimal(i**i)
f=n/d
s+=f
i+=1
return s
我想知道除了 multithreading/multiprocessing 之外是否还有任何方法可以加快速度。我发现当我在螺纹件中做这些系列时,它们的准确性会降低。
可以对您的代码进行一些小的更改/简化,但正如已经指出的那样,您(有时)正在处理一些 非常 的大数字。
from decimal import getcontext, Decimal
def sophodream(a):
s, p = 0, 1
getcontext().prec = a
for i in range(1, int(a * 1.5)):
s += p / Decimal(i**i)
p = -p
return s
print(sophodream(100))
输出:
0.7834305107121344070592643865269754694076819901469309582554178227016001845891404456248642049722689389
显然只是一个非常简短的版本来证明功能