-4

你好,我用 Python 写了一些代码,使用mpmath任意精度数学模块:

from __future__ import division
from numpy import arctan, sin, absolute, log10
from mpmath import *
import time
imax = 1000001
x = mpf(0)
y = mpf(0)
z = mpf(0)
t = mpf(0)
u = mpf(0)
i = 1
mp.prec = 128
start_time = time.time()
while i < 1000001:
    i += 1
    x = mpf(x + 1)
    y = mpf(y + x * x)
    z = mpf(z + sin(y))
    t = mpf(t + absolute(z))
    u = mpf(u + log10(t))

print("--- %s seconds ---" % (time.time() - start_time))
print x
print y
print z
print t
print u

打印结果大约需要 87 秒。如何改进此代码?我在 Fortran 的朋友写了类似的程序,他只用了 3.14 秒就打印了结果。

4

1 回答 1

1

在评论中丢失的东西是这段代码使用了mpmath模块。*导入掩盖了所有计算都使用此模块中的特殊函数的事实:

from mpmath import *
mpf(x + 1)

mpmath 是一个免费的(BSD 许可)Python 库,用于任意精度的实数和复数浮点运算

numpy用户对速度的所有印象以及加速 numpy 代码的方式都无关紧要。该标签有 2.9K 关注者,该numpy标签有 0个关注者mpmathCodeReview身材更差。

至于 Fortran 比较,您甚至没有说明您的朋友正在使用什么 mp 数学包。编译后的 Fortran 代码总是比 Python 代码快,尽管很好地使用 numpy 'vectorization' 可以减少速度差异。但是这个代码示例并没有尝试使用任何这些 numpy 技巧(即使它们可以使用 mpmath)。它只是对单个数字进行计算,而不是数组。

有一个用于mpmath提问的 google 群组列表。我建议使用它。

==========================

因此,熟悉扩展精度计算的人已经回答了您的 CR 问题。

于 2015-11-23T01:41:30.107 回答