簡體   English   中英

如何在python中存儲非常大的數字數組?

[英]How to store array of really huge numbers in python?

我正在處理大量數據,例如150! 例如,計算結果不是問題
f = factorial(150)57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000

但是我還需要存儲一個數組,其中包含N個如此龐大的數字。 python列表可以存儲它,但是速度很慢。 numpy數組速度很快,但無法處理全部精度,這對於我稍后執行的某些操作是必不可少的,並且正如我已經測試過的那樣,用科學計數法(浮點數)產生的數字不能產生准確的結果。

編輯:

150! 只是一個巨大的例子,並不意味着我只使用階乘。 另外,整個數字集(不一定總是階乘的結果)會隨着時間而變化,我需要對這些數字作為參數進行函數的實現和重新評估,是的,需要全精度。

numpy數組可以在內部使用可以由處理器直接操作的簡單數據類型時,運行速度非常快。 由於沒有可以存儲大量數字的簡單本機數據類型,因此它們將轉換為浮點數。 可以告訴numpy使用Python對象,但這會變慢。

這是我電腦上的某些時間。 首先設置。

a是包含前50個階乘的Python列表。 b是一個numpy數組,所有值都轉換為float64 c是存儲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

現在來衡量索引。

%timeit a[30]
10000000 loops, best of 3: 34.9 ns per loop

%timeit b[30]
1000000 loops, best of 3: 111 ns per loop

%timeit c[30]
10000000 loops, best of 3: 51.4 ns per loop

索引到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列表似乎並不慢。 你慢什么?

如果將來需要析因數的確切數字,為什么不將結果而不是要“分解”的數字保存在數組中?

例如

你有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)邏輯,一個數組用於保存低階getsizeof(number) ,另一個用於保存getsizeof(number) ,例如,當getsizeof(number)超過任何大小。

將其存儲為主要因素及其功效的元組。 因式分解(例如N)的因式分解將包含小於N的所有素數。因此,每個元組中的第k個素數是第k個素數。 而且,您將要單獨保存已找到的所有素數的列表。 您可以輕松地以這種表示法存儲多達幾十萬個階乘。 如果您確實需要數字,則可以輕松地從中恢復數字(只需乘以因子以得到階乘,則忽略5的冪並從2的冪中減去5的冪即可。...導致5 * 2 = 10 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM