我想使用数百万个数据点(以小数表示)运行 100k+ 次模拟。我选择小数而不是浮点数是为了浮点精度和易于对我的逻辑进行单元测试(因为0.1 + 0.1 + 0.1浮点数不等于 0.3...)。
我希望通过使用 PyPy 来加快模拟速度。但在我的测试过程中,我遇到了 PyPy 无法处理decimal.Decimal甚至_pydecimal.Decimal根本无法处理的情况,并且比 CPython 解释器(使用 C 进行decimal.Decimal算术)慢得多。因此,我复制/粘贴了整个代码库,并将所有Decimals 替换为floats,性能得到了巨大的提升:PyPy 比 CPython 快 60-x70 倍 - 但牺牲了准确性。
是否有任何解决方案可以在 PyPy 中使用小数精度并具有性能优势?我“可以”维护两个代码库:float用于批量运行 100k 模拟,Decimal用于稍后检查有趣的结果 - 但这需要维护两个代码库的开销......
以下是我在Raspberry Pi 4 (Ubuntu Server 20.10, 4 x 1.5GHZ ARM Cortex-A72, 8GB RAM)重现时运行的一些简单测试:
test_decimal.py
import time
from decimal import Decimal
start = time.time()
val = Decimal('1.0')
mul = Decimal('1.000001')
for …Run Code Online (Sandbox Code Playgroud)