我在处理大量的数据,比如150!。举例来说,计算结果不是问题f = factorial(150)
是
57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000
。在
但我还需要存储一个数组,其中有N个是这些大数,以完整的形式存储。python的列表可以存储它,但速度很慢。numpy数组很快,但不能处理完全的精度,这是我稍后执行的一些操作所必需的,而且正如我所测试的,科学记数法(float)中的数字不能产生准确的结果。在
编辑:
150!只是一个巨大数字的例子,并不意味着我只研究阶乘。而且,整组数字(不总是因式分解的结果)会随着时间而变化,我需要实现并重新评估一个函数,因为这些数字是一个参数,是的,需要完全的精度。在
当numpy数组可以在内部处理可由处理器直接操作的简单数据类型时,它们的速度非常快。因为没有简单的本地数据类型可以存储大量的数字,所以它们被转换成一个float。可以告诉numpy使用Python对象,但这样做会比较慢。在
这是我电脑上的一些时间。首先是设置。在
a
是一个包含前50个阶乘的Python列表。b
是一个numpy数组,所有值都转换为float64
。c
是一个存储Python对象的numpy数组。在现在来衡量索引。在
^{pr2}$索引到Python列表中最快,其次是从numpy数组中提取Python对象,最慢的是从优化的numpy数组中提取64位浮点。在
现在让我们测量每个元素乘以2。在
由于
b*2
可以利用numpy的优化数组,因此它是最快的。Python列表排在第二位。使用Python对象的numpy数组是最慢的。在至少在我运行的测试中,索引到Python列表中并不慢。什么对你来说很慢?在
将其存储为素因子及其幂的元组。一个阶乘的因式分解将包含所有小于N的素数,因此每个元组中的第k位将是第k个素数。你要把找到的所有素数单独列出来。在这种表示法中,可以轻松地存储高达几十万的阶乘。如果你真的需要这些数字,你可以很容易地从中恢复它们(只要忽略5的幂,在乘以因子得到阶乘时从2的幂中减去5的幂。。。因为5*2=10)。在
如果将来需要阶乘的确切数目,为什么不把结果保存在数组中,而是保存要“阶乘”的数字?在
例如
您有
f = factorial(150)
结果是
57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000
但您可以简单地:
编辑:
好吧,那么我的建议是同时使用我建议的逻辑}超过任何大小时。在
getsizeof(number)
你可以合并或使用两个数组,一个数组保存低阶乘数,另一个数组保存大数组,例如当{相关问题 更多 >
编程相关推荐