如何在python中存储大量的数字数组?

2024-04-27 00:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在处理大量的数据,比如150!。举例来说,计算结果不是问题
f = factorial(150)57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000。在

但我还需要存储一个数组,其中有N个是这些大数,以完整的形式存储。python的列表可以存储它,但速度很慢。numpy数组很快,但不能处理完全的精度,这是我稍后执行的一些操作所必需的,而且正如我所测试的,科学记数法(float)中的数字不能产生准确的结果。在

编辑:

150!只是一个巨大数字的例子,并不意味着我只研究阶乘。而且,整组数字(不总是因式分解的结果)会随着时间而变化,我需要实现并重新评估一个函数,因为这些数字是一个参数,是的,需要完全的精度。在


Tags: 数据numpy编辑列表精度数字科学数组
3条回答

当numpy数组可以在内部处理可由处理器直接操作的简单数据类型时,它们的速度非常快。因为没有简单的本地数据类型可以存储大量的数字,所以它们被转换成一个float。可以告诉numpy使用Python对象,但这样做会比较慢。在

这是我电脑上的一些时间。首先是设置。在

a是一个包含前50个阶乘的Python列表。b是一个numpy数组,所有值都转换为float64c是一个存储Python对象的numpy数组。在

import numpy as np
import math
a=[math.factorial(n) for n in range(50)]
b=np.array(a, dtype=np.float64)
c=np.array(a, dtype=np.object)

a[30]
265252859812191058636308480000000L

b[30]
2.6525285981219107e+32

c[30]
265252859812191058636308480000000L

现在来衡量索引。在

^{pr2}$

索引到Python列表中最快,其次是从numpy数组中提取Python对象,最慢的是从优化的numpy数组中提取64位浮点。在

现在让我们测量每个元素乘以2。在

%timeit [n*2 for n in a]
100000 loops, best of 3: 4.73 µs per loop

%timeit b*2
100000 loops, best of 3: 2.76 µs per loop

%timeit c*2
100000 loops, best of 3: 7.24 µs per loop

由于b*2可以利用numpy的优化数组,因此它是最快的。Python列表排在第二位。使用Python对象的numpy数组是最慢的。在

至少在我运行的测试中,索引到Python列表中并不慢。什么对你来说很慢?在

将其存储为素因子及其幂的元组。一个阶乘的因式分解将包含所有小于N的素数,因此每个元组中的第k位将是第k个素数。你要把找到的所有素数单独列出来。在这种表示法中,可以轻松地存储高达几十万的阶乘。如果你真的需要这些数字,你可以很容易地从中恢复它们(只要忽略5的幂,在乘以因子得到阶乘时从2的幂中减去5的幂。。。因为5*2=10)。在

如果将来需要阶乘的确切数目,为什么不把结果保存在数组中,而是保存要“阶乘”的数字?在

例如

您有f = factorial(150)

结果是57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000

但您可以简单地:

def values():

    to_factorial_list = []
        ...
        to_factorial_list.append(values_you_want_to_factorialize)
    return to_factorial_list

def setToFactorial(number):
    return factorial(number)

print setToFactorial(values()[302])

编辑:

好吧,那么我的建议是同时使用我建议的逻辑getsizeof(number)你可以合并或使用两个数组,一个数组保存低阶乘数,另一个数组保存大数组,例如当{}超过任何大小时。在

相关问题 更多 >