2012-06-22 2 views
4

일일 코딩을 돕기 위해 여러 개인 라이브러리를 만들었습니다. 모범 사례는 Python 프로그램의 시작 부분에 가져 오기를 넣는 것입니다. 하지만 내 라이브러리 또는 함수 나 클래스를 라이브러리에서 가져옵니다. 모든 모듈이 임포트됩니다 (사용되지 않는 다른 클래스 나 함수에서 사용되는 경우에도 마찬가지 임). 나는 이것이 프로그램의 오버 헤드를 증가 시킨다고 생각합니까?크기 및 오버 헤드를 줄이기 위해 python 가져 오기를 제어합니다.

하나의 예. 나는 이런 식으로 보이는 pytools 라이브러리를 가지고있다.

import difflib 

def foo(): 
    # uses difflib.SequenceMatcher 

def bar(): 
    # benign function ie 
    print "Hello!" 
    return True 

class foobar: 
    def __init__(): 
     print "New foobar" 
    def ret_true(): 
     return True 

함수 foo는 difflib를 사용한다. 이제 bar와 foobar를 사용해야하는 새로운 프로그램을 작성하고 있다고 가정 해보십시오. 나는 수 중

import pytools 
... 
item = pytools.foobar() 
vals = pytools.bar() 

를 작성하거나 나는

from pytools import foobar, bar 
... 
item = foobar() 
vals = bar() 

을 할 수 있는가 중 하나를 선택 오버 헤드를 감소 시키거나 foo에와 difflib에 대한 종속성의 수입을 배제? difflib 로의 임포트가 foo 함수 내부에 있다면?

내가 실행중인 문제는 간단한 프로그램을 내 라이브러리의 하나 또는 두 개의 클래스 나 기능 만 사용하는 실행 파일로 변환 할 때 발생합니다. 실행 파일은 50MB 정도가됩니다.

저는 py2exe의 최적화 된 크기 페이지를 읽고 제안 사항 중 일부를 사용하여 최적화 할 수 있습니다.

http://www.py2exe.org/index.cgi/OptimizingSize

내가 정말 여기에 가장 좋은 방법을 요구하고있다 같아요. 의존성이 사용되지 않는 함수 또는 클래스에있는 라이브러리 가져 오기를 방지 할 수있는 방법이 있습니까? 필자는 import 문이 디버거를 사용하여 실행되는 것을 보았고 파이썬은 계속 진행하기 전에 "def somefunction"을 사용하여 "pick up"하는 것처럼 보입니다. 함수/클래스가 사용될 때까지 나머지 import가 완료되지 않았습니까? 이것은 함수 또는 클래스의 시작 부분에 대량의 가져 오기를두면 라이브러리의 나머지 부분에 대한 오버 헤드를 줄일 수 있음을 의미합니다.

+0

이것은 실제로 파이썬 코드에서 이진 파일로의 변환기에 관한 질문입니다. 어떤 변환기를 사용하고 있습니까? –

+0

나는 그것을 확인하는 방법을 모르겠다? 도움이된다면 Python 2.6을 사용하고 있습니다. –

+0

"... 간단한 프로그램을 실행 파일로 변환 중입니다 ..."라고 말하는 중입니다. 이 변환 작업을 수행하려면 몇 가지 프로그램이 필요합니다. 이 프로그램은 포함 할 모듈을 결정합니다. –

답변

2

종속성을 효과적으로 줄이는 유일한 방법은 도구 상자를 더 작은 모듈로 분할하고 필요한 모듈 만 가져 오는 것입니다.

사용하지 않는 함수의 시작 부분에 가져 오기를두면 런타임에 이러한 모듈을로드하지 못하지만 종속성을 숨기므로 권장하지 않습니다. 또한, 파이썬에서 동적 인 특성으로 인해 실제로 호출되는 함수를 정적으로 결정할 수 없으므로 파이썬에서 실행 가능 변환기로 이러한 모듈을 포함해야 할 가능성이 높습니다.

+0

은 (인터프리터의) 프로그램에서 어떤 함수 나 클래스가 (심지어 런타임에) 호출 될지 선언하는 방법이 있습니다.X import Y에서 사용하기위한 나의 초기 해석은 인터프리터에게 내가 필요한 유일한 함수 또는 메소드라는 것을 알려주는 것이었다. –

+0

@PaulSeeb : 이것을 선언하는 유일한 방법은 작은 모듈을 작성하고 필요한 모듈 만 포함하는 것입니다. –

+0

패키지를 사용하여이 작업을 수행해야합니까? –

관련 문제