2013-05-02 2 views
2

파이썬에서 함수 호출 결과의 합계를 찾는 가장 빠른 방법은 (병렬 처리를하지 않고) 무엇입니까?파이썬에서 sum (f (x))하는 가장 빠른 방법

은 값 목록이며, 각각을 f(x)으로 변환하여 합한 것입니다. 지금 ("평면은 항상 낫다"마음에 유지)를 위해 나는이 있습니다 만 이것은 잘 작동하지만 내 xlist 꽤 큰

sum([f(x) for x in xlist]) 

(~ 20000 개 부동 소수점 값)이 합계라고 몇 번 중 대부분의 시간 리소스를 소모하는 프로그램 실행 더 효율적인 방식으로 구현할 수있는 방법이 있습니까?

나는 C++ 흠 또는 당신이 생각할 수있는 어떤 다른 방법을 추가 상관하지 않습니다 만의 이익을 위해 전체 프로그램의 구조를 변경하고 싶지 않아요 ...

+1

당신이 20000 개 숫자를 가지고 당신이 작동하고 그들에게 시간, 당신은 왜 파이썬을 사용하고 피하고 수백만의 합계를 시도하는 경우 병렬 처리? – jtbandes

+0

xlist가 꽤 큰 것처럼 iterator 대신 generator를 사용하십시오. 즉 sum (xlist의 x에 대한 f (x))) –

+0

@jtbandes 2 일 안에이 프로그램을 작성 했으므로 성공하면 나중에 평행 C++ 평가를 쓸 수 있지만 적어도 한 달은 걸릴 것입니다. 나는 1 시간을 말하기 위해 그것을 자르는 것이 가능하다면 실행을 기다리는 데 2 ​​시간을 소비하기를 원하지 않는다. – sashkello

답변

6

광장을 제거하기 괄호가 트릭을해야합니다.

sum(f(x) for x in xlist) 

는 발전기 식을 합산하고, 제 1 메모리에 저장되어있는 목록을 만들 필요성을 제거한다. 오히려 생성기를 반복하면서 요소를 합산합니다.

파이썬 3에서는 map (파이썬 2에서 itertools.imap)을 사용하는 것이 조금 빠릅니다.

import itertools 
sum(itertools.imap(f, xlist)) 

합니다 (sum 공정한 몇 번 호출 할 예정으로) 당신이 만들 수있는 또 다른 최적화는 . 연산자를 사용하여 오버 헤드를 제거하는 것입니다.

from itertools import imap 
sum(imap(f, xlist)) 
+0

잘 모름 발전기에 관해서는 read와 test를 할 것입니다 ... – sashkello

+0

http://www.dabeaz.com/generators/ –

+1

그 외에도'map'은 [claim]되어 있습니다 (http://stackoverflow.com/a/1247490)./770830)보다 약간 빠름 (또는 python2의 경우 itertools.imap) – bereal

2

나는 Volatility's.

유사하지만 또한 Memoization decorator를 사용하여 aproach를 추천 할 것입니다. (단지 당신이 기대하는 경우에 매우 유용 여러 개의 동일한 값)

def memodict(f): 
    """ Memoization decorator for a function taking a single argument """ 
    class memodict(dict): 
     def __missing__(self, key): 
      ret = self[key] = f(key) 
      return ret 
    return memodict().__getitem__ 

@memodict 
def f(x): 
    pass # your code 

sum(f(x) for x in xlist) 

소스 : Memodict

+0

이 함수는 실제로 다른 함수 내에서 호출되며 둘 이상의 인수를가집니다. 이 경우에도 적용될 수 있습니까? – sashkello

+1

여러 개의 인수를 처리하는 또 다른 메모 데코레이터를 사용할 수도 있지만 이러한 경우에는 가능한 빨리 코드를 줄이거 나 다시 팩할 것입니다. 데이터를 계산하는 데 수백만 번 호출되는 단일 인수 함수는 처리보다 훨씬 빠릅니다. 여러 함수 호출 등 ...이 모든 것이 클래스 또는 다른 함수 내에 포함되어 있으면 더 빠를 것입니다. 파이썬에서 지역성이 전역 성보다 빠르기 때문에. –

+0

좋아요, 재미있을 것 같네요, 이걸 탐험 할 겁니다. – sashkello

관련 문제