2009-10-16 7 views
2

(응용 프로그램 시작 시간이 절대적으로 중요하며 응용 프로그램이 많이 시작되고 응용 프로그램이 보통 때보 다 느리며 많은 파일을 가져와야하고 .pyc 개의 파일로 컴파일하는 환경에서 응용 프로그램이 실행된다고 가정하십시오. 사용할 수 없습니다.)여러 개의 Python 소스 파일을 하나의 파일로 연결하는 방법은 무엇입니까?

모듈 모음을 정의하는 모든 Python 소스 파일을 하나의 새로운 Python 소스 파일로 연결하고 싶습니다.

원본 파일 중 하나를 가져온 것처럼 새 파일을 가져온 결과가 좋겠습니까? 원본 파일을 더 가져 오는 등의 작업이 필요합니다.

이것이 가능합니까?

'bar'및 'baz'모듈의 소스 파일을 제공 할 때 도구가 생성 할 수있는 대략적인 수동 시뮬레이션입니다. 코드를 배포하기 전에 이러한 도구를 실행하십시오.

__file__ = 'foo.py' 

def _module(_name): 
    import types 
    mod = types.ModuleType(name) 
    mod.__file__ = __file__ 
    sys.modules[module_name] = mod 
    return mod 

def _bar_module(): 

    def hello(): 
     print 'Hello World! BAR' 

    mod = create_module('foo.bar') 
    mod.hello = hello 
    return mod 

bar = _bar_module() 
del _bar_module 

def _baz_module(): 

    def hello(): 
     print 'Hello World! BAZ' 

    mod = create_module('foo.bar.baz') 
    mod.hello = hello 
    return mod 

baz = _baz_module() 
del _baz_module 

그리고 지금 당신은 할 수 있습니다

from foo.bar import hello 
hello() 

이 코드는 import 문 및 종속성과 같은 것들을 고려하지 않습니다. 이 코드 또는 다른 기술을 사용하여 소스 파일을 어셈블 할 기존 코드가 있습니까?

브라우저에 보내기 전에 JavaScript 파일을 조합하고 최적화하는 데 사용되는 도구와 매우 비슷합니다. 여러 HTTP 요청 대기 시간으로 인해 성능이 저하됩니다. 이 Python의 경우 시작시 수백 개의 Python 소스 파일을 가져 오는 것이 지연됩니다.

+6

이것이 인터프리터 시작 시간에 영향을 줄 것이라는 점을 증명하는 숫자가 있습니까? –

+0

시작 시간이 확실히 문제입니다. 이 일이 더 빨라지기를 바래요. 문제의 제한을 분명히했습니다. –

+1

나는 회의 속도가 빨라진다는 것도 회의적이다. 앱이 다시로드 될 때마다 여전히 X 줄의 코드를 VM에로드해야합니다. 모듈을 하나의 큰 파일로 통합하기 전에 시간을 투자 할 필요가 없다는 것을 확인하는 데 시간을 투자 할 것입니다. – JasonSmith

답변

1

필자는 파이썬 파일과 시스템 캐싱의 사전 컴파일로 인해 결국 속도를 측정 할 수 없을 것이라고 생각합니다.

+0

"측정 할 수 없다"는 뜻입니까? –

+0

.pyc 파일에 대한 사전 컴파일을 사용할 수 없습니다. 이 특별한 상황에서 캐싱은 내가 바라는만큼 좋지 않습니다. 나는이 질문에 이것을 분명히했다. –

+0

예, 물론 "측정 할 수 없습니다":) –

3

태그가 표시로이 구글 애플 리케이션 엔진에있는 경우는 평을 변경하지 않는 한 GAE는 모든 요청하여 응용 프로그램을 다시 시작하지 않기 때문에

def main(): 
    #do stuff 
if __name__ == '__main__': 
    main() 

, 그냥 실행이 관용구를 사용하고 있는지 확인 main() 다시.

이 트릭을 사용하면 시작 성능없이 CGI 스타일 앱을 작성할 수는

핸들러 스크립트가 주() 루틴을 제공하는 경우

AppCaching

, 또한 런타임 환경 캐시 스크립트를했다. 그렇지 않은 경우 요청마다 핸들러 스크립트가로드됩니다.

+0

고마워,하지만 이미 이러는거야. 앱 엔진은 캐시를 1 초 정도만 캐시하는 경우가 많으므로 매일 14,000 개 정도 캐시 미스가 발생할 수 있으며 복잡한 가져 오기 종속성이있는 많은 모듈을 사용할 때 더욱 심해집니다. 저는 정말 최대 시동 성능에 관심이 있습니다. –

0

이렇게하면 성능이 향상되지 않을 수 있습니다. 여전히 더 적은 수의 모듈로 동일한 양의 Python 코드를 가져오고 있습니다. 모든 모듈성을 희생합니다.

더 나은 방법은 코드 및/또는 라이브러리를 수정하여 필요할 때만 가져 오기하여 각 요청에 대해 최소한의 필수 코드가로드되도록하는 것입니다.

+0

배포 전에 도구를 사용하여 소스 코드를 처리하도록 제안했기 때문에 모든 모듈성을 희생하지는 않습니다. 현대 자바 스크립트 도구가 결합되어 실제 브라우저에 배포하기 전에 javascript를 분할하고 최적화하는 방식으로 대단히 중요합니다. "필요한 것을 가져 오기 위해서만 코드를 작성하십시오."라고 말하는 것이 좋습니다. 그렇다면 contrib 모듈, 외부 라이브러리 및 작성할 수있는 모든 것을 포함하지 않고 코어 장고에서 300 개의 소스 파일을 사용할 수 없습니다. 게다가 실제로 코드를 많이 사용하기 때문에 많은 코드를 가져오고 싶어합니다. –

+0

Nick, Google에서 일하고 있습니다. App Engine에 배포하는 사용자 코드를로드하는 과정을 설명해 주시겠습니까? 모든 사용자 코드가 모든 인스턴스에 동시에 배포되지 않기 때문에 기존 설치에서와 같이 여러 모듈이로드 될 때 단순히 디스크 비용을 찾는 것이 아닙니다. 실제로 어떻게 이루어 집니까? 실제로 어떻게 이루어 집니까? 모든 파일이 한 번에 하나씩 또는 일괄 적으로 배포됩니까? 맞춤 우편 번호는 어떻게 작동합니까? 하나의 모듈을 zip에서로드 할 때 모든 모듈이로드되어 있습니까? 등등 ... –

+0

주문형 가져 오기를 수행하는 데 '300 홀수'소스 파일을 사용하는 것이 문제가되는 경우 모두 연결하려는 경우 문제가 많습니다. 상당한 수정이 필요합니다. Django와 같은 큰 프레임 워크를 사용할 때의 문제점은 관찰 한 것처럼 가져 오는 데 오랜 시간이 걸린다는 것입니다. 당신이 어떤 주어진 요청에 대해 20 % 정도의 모듈을 사용하고 있는지 의심 스럽습니다. –

0

이 기술이 당신의 환경에서 물건을 밀어 올릴 지 여부와 관계없이 질문을 다루지 않고, 당신이 옳았다 고 말하면, 내가 한 일은 여기에 있습니다.

나는 모든 모듈 목록을 만들 것입니다. my_files = ['foo', 'bar', 'baz']

나는 모든 코드는 하나의 파일에 지금 이후의 모든 import foo|bar|baz 라인을 필터링, 새 파일에 소스 디렉토리 아래에있는 모든 파일의 모든 라인을 읽을 유틸리티을 os.path 사용하고 그들 모두를 기록한다.

저주받은 파일의 마지막에 __init__.py (있는 경우)의 main()을 추가하십시오.

관련 문제