有没有办法让python中的长迭代代码在获取越来越多信息的过程中不需要花费越来越长的时间来运行?
我注意到,我正在试验的一些最新代码开始运行时非常快,通常每秒有数千个小数(可能有些夸张,但这是相当可观的数字/秒),但在达到大约10000或更高的小数点后,它只会每秒增加50左右的小数 我以前听说过,有一些方法可以构造代码,这样就不会出现这个问题。我不确定这是否是通过去除已经处理过的数字或其他东西来实现的 一些代码可能很有用,尽管我现在更多的是寻找我可以使用的技术的一般答案,而不是针对我的特定用例的答案 这是查找数字的代码:有没有办法让python中的长迭代代码在获取越来越多信息的过程中不需要花费越来越长的时间来运行?,python,python-3.x,Python,Python 3.x,我注意到,我正在试验的一些最新代码开始运行时非常快,通常每秒有数千个小数(可能有些夸张,但这是相当可观的数字/秒),但在达到大约10000或更高的小数点后,它只会每秒增加50左右的小数 我以前听说过,有一些方法可以构造代码,这样就不会出现这个问题。我不确定这是否是通过去除已经处理过的数字或其他东西来实现的 一些代码可能很有用,尽管我现在更多的是寻找我可以使用的技术的一般答案,而不是针对我的特定用例的答案 这是查找数字的代码: while counter != decimal + 1:
while counter != decimal + 1:
if 4 * q + r - t < n * t:
# yield digit
yield n
# insert period after first digit
if counter == 0:
yield '.'
# end
if decimal == counter:
print('')
break
counter += 1
nr = 10 * (r - n * t)
n = ((10 * (3 * q + r)) // t) - 10 * n
q *= 10
r = nr
else:
nr = (2 * q + r) * l
nn = (q * (7 * k) + 2 + (r * l)) // (t * l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
for d in pi_digits:
print(d, end='')
i += 1
if i == 100:
print("")
i = 0
另外,我现在有100行的pi打印数字,通过减少或增加行中的数字数量,使代码不必经常断行,我能获得任何速度优势吗?不幸的是,你得到的是越来越大的数字计算,它在内存中占用了更多的空间,并且使用它执行计算的时间越来越长,因此代码在运行过程中不可避免地会花费更长的时间 已经处理过的数字将自动处理,因为您正在用新值替换变量 至于print语句,我怀疑它是否会对性能产生明显的影响,但为了简单起见,我建议用以下代码替换当前代码:
print("".join(pi_digits))
可以肯定的是,问题在于python的底层“大整数”实现 如果数字很小,python可以使用公共的32/64位值来表示它们,但有一个限制。由于python的目标是易于使用,因此对于大于“bignum”的数字,它会切换到自定义实现。虽然我不确定python是如何实现的,但大多数BigNum/BigInt/etc实现都使用数组来表示每个数字。因此,如果我们在bignum结构中表示
123
,我们将每个数字存储在数组中一个单独的项中,如下所示:
value=[1,2,3]
这对于存储数字是很好的,但是正如您所期望的,对于执行操作来说并不是很好。处理器可以很好地处理32/64位的值操作,但它们不知道如何将[1,2,3]
与[6,2,1,5]
相乘。这意味着需要运行大量python代码来处理这些操作,而且速度很慢
如果你这样做只是为了好玩,保持原样,或者尝试用较低级别的语言编写具有更快BigInt实现的相同代码,我的建议是,但是如果你真的需要快速编写代码,只要涉及数字,需要快速运行,可能有一种结构或算法可以帮助你,因为它使用C代码来运行东西。搜索“numpy bigint”、“numpy large numbers”等,你会找到一些方法来加速你的算法