我已经使用Python模块Decimal编写了代码,但是执行它需要一些时间。
所以,我想增强它。对它进行性能分析后,我发现可以对功能进行改进。
因此,我有两个问题:
Collecting pypi-cdecimal
Using cached https://files.pythonhosted.org/packages/c6/3e/0e8408545ef9bca6e11956c1e78215b820f0193669afe8750f9cbaa054d1/pypi-cdecimal-2.3.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/private/var/folders/lf/v8d843ms57dd27cslfdcbrlc0000gn/T/pip-install-wvun3np6/pypi-cdecimal/setup.py", line 426, in <module>
ext_modules = [cdecimal_ext(MACHINE)]
File "/private/var/folders/lf/v8d843ms57dd27cslfdcbrlc0000gn/T/pip-install-wvun3np6/pypi-cdecimal/setup.py", line 315, in cdecimal_ext
config_vars = configure(machine, cc, py_size_t)
File "/private/var/folders/lf/v8d843ms57dd27cslfdcbrlc0000gn/T/pip-install-wvun3np6/pypi-cdecimal/setup.py", line 230, in configure
os.chmod("./configure", 0x1ed) # pip removes execute permissions.
FileNotFoundError: [Errno 2] No such file or directory: './configure'
是否可以对我的代码进行cythonize?我可以使用Decimal变量进行cythonize吗?
如果其中任何一个有帮助,我是否必须切换到numpy?
答案 0 :(得分:2)
作为一般规则,cmodule
是用C语言编写的module
的版本(而不是纯Python)。如果可用,Python 3将自动选择使用c
版本,并且自CPython 3.3起,cdecimal
已内置。
因此,如果您使用的是CPython(如果您不知道那是什么,那么您肯定会使用),那么您每次cdecimal
都已经在使用import decimal
。
问题是,以300位精度工作非常昂贵。这仅仅是一个基本限制。 Numpy并未针对此类事情进行优化,因此也无济于事(因为内置Numpy类型均不具备此能力)。我怀疑Cython是否会有所帮助,因为它可以通过使用本机C数据类型(与Numpy相同)来提高速度。使代码运行更快的最佳方法是降低精度。
关于如何降低精度,这取决于您的问题。例如,一个朴素的贝叶斯模型可能会涉及到将小数,小数乘以小数点后的百个零,然后再得到重要的结果。因此,您可能会认为您需要一个具有这么多位数的Decimal
。在实践中,您可以取对数并加而不是乘,现在您的精度需求得到解决,同时仍然给出了正确的答案。