2014-12-02 3 views
0

사전을 가져 와서 각 키를 해당 값의 값으로 올리려고합니다. 그리고 (2) (1) .dict 키를 해당 값의 값으로 올리고 함께 빠르게 곱하십시오.

이 작업은 수 백만 행의 데이터에 대해 수행해야합니다. 프로세스 속도를 높이는 방법에 대한 의견이 있으십니까? 나는 팬더 데이터 프레임의 맵 기능을 사용하여 데이터의 내 열에 이미 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 

1000 만 개 항목이 빠른 속도 테스트 :

>>> %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, 1 또는 무한대입니다. 여기에서 뭔가 감각적 인 작업을하고 싶습니다. 예를 들어, 이해를 사용하는 방법에 대한

+0

좋은 솔루션! 네, 수백만 줄 이죠. 각각 작은 크기의 딕트가 들어 있습니다. 그래서 그 기능을 수백만 개의 dicts에 적용합니다. 수백만 항목의 공문서가 아닙니다. – JoeDanger

+0

아, 알겠습니다. 그것은 더 의미가 있습니다. 글쎄,이 솔루션은 많은 속도 향상을 가져 오지 않을 것입니다. 그런 다음 많은 시간이 여러분의 행을 반복하는 데 소비되는 것을 보게 될 것입니다. 어떻게 든 사전에서 데이터를 가져와 전체 프로세스를 벡터화 할 수 있도록 모든 것을 하나의 거대한 배열로 옮기는 것에 대해 생각해 보겠습니다. – jme

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 
관련 문제