2016-08-23 3 views
0

이 질문은 여러 번 SO (예 : here)로 요청되었지만 아직 실제 답변이 없습니다.파이썬 가져 오기 속도를 향상시키는 방법은 무엇입니까?

템플릿을 렌더링하는 짧은 명령 줄 도구를 쓰고 있습니다. 그것은 메이크 물건 만하다는 사용된다

이 예에서는 더미
i = $(wildcard *.in) 
o = $(patsubst %.in, %.out, $(t)) 

all: $(o) 

%.out: %.in 
    ./script.py -o [email protected] $< 

는 메이크는 .out 파일을 생성하기 위해 모든 .in 파일을 파싱한다. make을 사용하는 것이 매우 편리합니다. 왜냐하면이 스크립트 전후에 다른 작업을 수행해야하기 때문입니다. 또한 가능한 한 KISS으로 남고 싶습니다. 문제는 각 점이다

#!/usr/bin/env python 
from jinja2 import Template, nodes 
from jinja2.ext import Extension 
import hiyapyco 
import argparse 
import re 

... 

:

따라서, 나는 별도로 script -o out in

내 스크립트는 다음 사용하는 구문을 사용하여 바보, 간단한 내 도구를 유지하려는 각 파일을 처리 실행은 약 1.2 초 (가공에 대해서는 ~60ms, 수입 지침에 대해서는 ~1140ms)가 걸립니다.

$ time ./script.py -o foo.out foo.in 
real 0m1.625s 
user 0m0.452s 
sys  0m1.185s 

내 파일의 100 개 파일에 대한 전체 실행은 말도 안됩니다 : ~ 100 개의 파일 x 1.2s = 120s.

이것은 해결책은 아니지만 해결책이되어야합니다.

어떤 대안을 사용할 수 있습니까?

편집

구문 읽을 수 및 지역 사회의 크기 때문에 파이썬을 사랑 해요. 이 특별한 경우 (명령 줄 도구)에서는 Perl이 여전히 괜찮은 대안이라는 것을 인정해야합니다. Perl로 작성된 동일한 스크립트 (해석 언어이기도 함)는 약 12 ​​배 빠릅니다 (Text::Xslate 사용).

어쨌든 펄을 홍보하고 싶지는 않습니다. 필자는 파이썬으로 가장 큰 문제를 해결하기 위해 노력하고 있습니다. 가져 오기 시간이 짧기 때문에 간단한 명령 행 도구로는 아직 적합하지 않습니다.

+0

[Code Review] (http://codereview.stackexchange.com/)에 더 적합합니다. 만큼 완벽하게 작동하는 예제 – muddyfish

+0

@muddyfish 이것은 Python으로 작성된 CLI 도구와 관련이 있으므로 코드 검토 질문이 아닙니다. – nowox

+0

질문에 대한 해결책은 아니지만 처음에는 병렬로 작업하는 것이 어떻습니까? 당신의 문제를 해결할 수 있습니다. –

답변

3

그것은 매우 쉬운 일이 아닙니다,하지만 당신은 배경에 앉아 및 프로세스가 처리 명령 하나에 프로그램을 켤 수를 가져 오는 그런 식으로 파일.

다른 프로그램이 처리 명령을 피드에 입력하여 실제 시작을 매우 쉽게 할 수 있습니다.

+1

모듈 가져 오기의 속도를 높이는 좋은 방법이 없다고 생각하기 때문에 이것이 아마도 가장 합리적인 해결책이라고 생각합니다. –

0

glob을 사용하면 필요한 파일로 해당 작업을 수행 할 수 있습니다.

import glob 
in_files=glob.glob('*.in') 
out_files=glob.glob('*.out') 

따라서 모든 파일 쌍마다 스크립트를 호출하는 대신 동일한 스크립트의 모든 파일을 처리합니다. 최소한 당신은 매번 파이썬을 시작할 필요가 없습니다.어디에 문제가

+1

당신은 실제로 질문에 답하지 않고 있습니다. – nowox

+0

많은 파일을 처리해야 할 때 사용하는 해결 방법 일뿐입니다. 스크립트를 호출하고 매번 매번 라이브러리를로드하면 물론 처리하는 파일 쌍의 수를 나타내는 'n'시간이 걸릴 것입니다. – silgon

0

그것은 바로 지금, 매우 명확한 것 같다 당신이있어 :

는 의미

cost(file) = 1.2s = 60ms + 1040ms :

cost(N*files) = N*1.2s

지금, 왜 당신이되기 위해 변경하지 마십시오 :

cost1(files) = 1040ms + N*60ms

그런 식으로하면 이론적으로 100 개의 파일을 처리하는 데 7,04 초가 걸릴 수 있습니다. 120S

편집 :

# foo.py 
import numpy 
import cv2 

print sys.argv[0] 

실행 시간은 : 나는이 질문에 downvotes를 수신하고 있습니다 때문에

, 나는 이제이 파이썬 파일을 가지고 가정하자, 약간의 예를 게시합니다 내 상자에 1.3s, 지금 내가 할 경우 :

for /l %x in (1, 1, 100) do python foo.py 

내가 100 * 1.3s 실행 시간을 얻을 것이다, 나의 제안은 이것으로 foo.py을 설정했다 :

import numpy 
import cv2 

def whatever_rendering_you_want_to_do(file): 
    pass 

for file in sys.argv: 
    whatever_rendering_you_want_to_do(file) 

번 대신 100 배

+0

정확히, 당신은 문제가 어디에 있는지 지적했다. 그래서 내 질문 "어떻게 파이썬 가져 오기 속도를 향상시키기 위해?" – nowox

+0

@nowox 나는 내 대답을 편집했다. 도움이되기를 바란다. 왜 사람들이 전에 downvoting을했는지 모르겠다. 나는 그 문제를 확인하는 것이 유효한 대답이라고 생각했다. – BPL

+0

나는 당신의 대답을 이해하고 이것은 아마도 다른 질문에 대한 좋은 해결책 일 것이지만,이 특별한 질문은 아닙니다. 내 파이썬 스크립트 내에서 for 루프를하고 싶지 않다. – nowox

1

템플릿 부분을 별도의 프로세스로 작성하십시오. 처음으로 "script.py"가 실행되면이 별도의 프로세스가 시작됩니다. 프로세스가 존재하면 명명 된 파이프를 통해 입력/출력 파일 이름을 전달할 수 있습니다. x 초 동안 입력이 없으면 자동으로 종료됩니다. x가 얼마나 큰지는 사용자의 필요에 따라 다릅니다.

따라서 매개 변수는 명명 된 파이프에 대한 script.py 쓰기를 통해 장기 실행 프로세스로 전달됩니다. 가져 오기는 한 번만 수행됩니다 (입력이 매우 빈번한 경우). BPL은 모든 것이 더 빨리 실행될 것이라고 말합니다.

+0

Makefile을 사용하여 작업 예제를 제공 할 수 있습니까? – nowox

관련 문제