2014-12-02 37 views
0

我試圖採取字典和(1)提高每個關鍵的價值的力量,和(2)乘以(1)的結果, 。提高字典鍵的價值的力量,並迅速放在一起

這需要完成數百萬行的數據。關於如何加快這個過程的任何想法?我正在使用熊貓數據框的地圖功能將函數toTheExp應用於我的數據列。儘管這一步仍然很慢。目前我正在嘗試類似於:

import ast 
from numpy import array 
from functools import reduce 
import operator 

def toTheExp(d): 
    return reduce(operator.mul, array(d.keys())**array(d.values()), 1) 

toTheExp({2:3,4:5,6:7}) 
>>> 2293235712 

回答

2

由於您正在導入numpy,因此我認爲可以通過熊貓使用它。

def to_the_exp(d): 
    x = np.fromiter(d.iterkeys(), np.float, count=len(d)) 
    p = np.fromiter(d.itervalues(), np.float, count=len(d)) 
    return np.prod(x**p) 

使:

>>> to_the_exp({2:3,4:5,6:7}) 
2293235712 

有10萬個條目快速速度測試:

>>> %timeit to_the_exp(d) 
1 loops, best of 3: 2.99 s per loop 

和你的代碼給出:

>>> %timeit toTheExp(d) 
1 loops, best of 3: 7.96 s per loop 

你的代碼是不是真的很慢。也許瓶頸在別的地方?此外,數以千萬計的數字的產品通常是零,一,或無限...只是想確保你在這裏做一些有意義的事情。

+0

很好的解決方案!是的,它有數百萬行,每行都包含一個小字體的字典。所以它將功能應用到數百萬個字符。不是幾百萬詞條的詞典 – JoeDanger 2014-12-02 03:19:59

+0

啊,我明白了。這更有意義。那麼恐怕這個解決方案不會爲你提供很大的加速,然後,看到很多時間都會花在迭代你的行上。我會考慮以某種方式從數據字典中獲取數據,並將所有數據都放入一個大的數組中,這樣整個過程就可以被矢量化。 – jme 2014-12-02 03:24:09

2

怎麼樣使用理解,例如:

from functools import reduce 
from operator import mul 

print(reduce(mul,(k**v for k,v in {2:3,4:5,6:7}.items()),1) 
#2293235712