2011-11-10 4 views
2

큰 크기의 데이터로 작업하는 프로젝트가 파이썬으로 작성되었습니다. 실행 시간을 단축하고 싶습니다. 간단한 단어에서파이썬 실행 속도를 높이려면 어떻게해야합니까?

,의 내가이 샘플이 완전히 최적화 된 코드를 가정 해 봅시다 :이 속도를 높일 수있는 방법이

def foo(x): 
    doSomething 

main(): 
    for i in range(1,10000000): 
     foo(i) 

있습니까? 예를 들어 다중 처리 또는 다른 것들을 사용하여? 가장 중요한 것은 가치가있는 것입니까?

답장을 보내 주셔서 감사합니다. 나는 다중 처리 경로를 시도 할 것이라고 생각한다. 누군가 나에게 도움이되는 가이드 나 몇 가지 예를 제안 할 수 있습니까?

+3

당신은 정말 xrange' 대신 range''의'사용해야합니다 - 그렇지 않으면 당신은 메모리에 모든 "데이터"를 넣어 그냥 반복 할 수 있습니다. – ThiefMaster

+1

3.x가 아닌 onx를 2.x로 유지합니다 ... – glglgl

답변

7

유일한 알 수있는 방법은 프로필과 측정하는 것입니다. 귀하의 코드는 무엇이든 할 수 있습니다. "doSomething"은 time.sleep(10) 일 수 있으며이 경우 10000000 프로세스를 포크하면 전체 프로그램이 약 10 초 만에 실행됩니다 (단절된 오버 헤드와 이로 인한 속도 저하는 무시됩니다).

http://docs.python.org/library/profile.html을 사용하고 병목이 어디에 있는지 확인하여 더 나은 코딩을 사용하여 "완전히 최적화 된"프로그램을 최적화 할 수 있는지 확인하십시오. 이미 충분히 빠르면 그만하세요.

그런 다음 CPU 또는 I/O 바운드인지 하드웨어인지에 따라 다중 처리 또는 스레딩을 시도 할 수 있습니다. 문제가 해소 될 수 있다면 여러 대의 컴퓨터에 배포하고지도/축소하는 것도 시도해 볼 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 음, 내 프로그램은 방대한 양의 데이터를 반복하므로 최적화가 많아 질수록 성능이 훨씬 좋아질 것이라고 생각하지 않습니다. 그럼 내 질문은 : 멀티 프로세싱을 사용하면 속도는 얼마나 될까요? 내 프로젝트를 백만 개의 셀로 구성된 루프로 요약 할 수 있습니다. 나쁜 영어로 죄송합니다. :) – blueSurfer

+0

글쎄, 당신은 100 동등한 크기의 조각으로 그것을 분할하고 각 조각을 처리하고 결과를 결합하는 작업자 수영장을 사용할 수 있습니다. –

3

JIT 컴파일러가 내장 된 PyPy 인터프리터를 사용하면 실제로 이와 같은 루프에서 성능이 향상 될 수 있습니다. 다음은 link입니다. PyPy 인터프리터가 일반 CPython에 비해 제공하는 몇 가지 속도 향상에 대해 설명합니다.

또는 Cython을 사용하여 코드를 작성하면 파이썬에서 기본 c 확장을 사용할 수 있습니다. 좋은 속도 향상을 얻으려면이 방법으로 엄청난 양의 덩어리가 작성됩니다.

아니면 파이썬을 사용하는 것을 잊어 버리고 ASM에서 작성하면됩니다. 물론 그렇게하는 것이 더 어려울 것이지만, 프로그램이 모든 사람들보다 ~ 1 % 빠르게 실행되는 것을 볼 때? 너는 그 여분 마일을 가면 행복해 할 것이다.

+0

+1은 PyPy를 언급합니다. 또한 어셈블리에서 다시 작성하면 1 % 이상 향상 될 것입니다. :) –

+1

그렇지만 최적화에 관한 항문은 누구나 반짝이는 안전 접착제로 구석에 앉을 수 있습니다. –

+0

다른 방법으로도 * 가능합니다. –

2

이미 언급 한 내용 외에 cython을 확인할 수 있습니다. 하지만 전에 프로필. 또한 pypy은 체크 아웃 할 가치가 있습니다. 작동시키기 위해 필요한 일이 있어서는 안됩니다.

+1

pypy와 cython이 무엇인지를 설명하지 않고 어떻게 upvoted 되나요? –

+0

그는 당신의 대답과 같은 요약이 더 좋을지라도 충분한 링크를 제공합니다. –

9

마지막 질문에 대한 답을 얻으려면 성능에 문제가 있으면 그만한 가치가 있습니다. 그게 유일한 기준입니다. 에 관해서는

방법 : 그것은 계산 비용 때문에 알고리즘이 느린

경우 C extension로 다시 작성하거나, 파이썬 - 억양 언어로 빠른 확장을 작성할 수있게된다 Cython를 사용합니다. 또한 PyPy이 더 빨라지고 빠르며 코드를 수정하지 않고 실행할 수 있습니다.

코드가 계산적으로 비싸지는 않지만 방금 막대한 양의 루프가 발생하면 다중 처리로 코드를 분해하여 병렬 처리 할 수 ​​있습니다.

마지막으로 일종의 기본 데이터 표시 작업 인 경우 빠른 데이터 저장소 사용을 고려해보십시오. 모든 주요 관계형 데이터베이스는 wazoo에 최적화되어 있으므로 데이터베이스를 가져 와서 작업을 빠르게 시작할 수 있습니다. 큰 데이터 세트를 훌륭하게 집계 할 수있는 Redis 상점에 맞게 모양을 만들 수도 있습니다.

+0

+1 멋진 도구입니다. –

0

작업을 병렬로 수행 할 수있는 경우 multiprocessing 모듈을 사용하여 프로세스 풀을 조사하고 작업을 하위 프로세스로 분산시킬 수 있습니다.

0

정말 응용 프로그램에 따라 다르지만, doSomething을 멋지게 처리 할 수 ​​있으면 (예 : 무거운 C 코드가 많음) 작업을 수행하기 위해 여러 스레드를 생성하는 것이 좋습니다. 일반적인 패턴은 이런 식입니다 :

def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

q = Queue() 
for i in range(num_worker_threads): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 

for item in source(): 
    q.put(item) 

q.join()  # block until all tasks are done 
관련 문제