2012-02-17 5 views
1

(에 StackOverflow에 첫 번째 질문, :)가 기쁘다)가져 오기 모듈은 매우 느린

내가 IronPython의 2.7.1 및 C# .NET 4.0을 사용하고 있습니다를 2.7.1.

저는 파이썬 스크립트를 시작하기 위해 C#을 사용합니다. 많은 시간 동안 가져온 약 20 개의 개인 모듈이 있습니다. 예 :

module1.py, module2.py, module3.py, module4.py 및 main_script.py가있는 경우

main_script.py 수입 모듈 1과 모듈 2

모두 모듈 1과 모듈 2 수입 module3.

모듈 1과 module3 수입 module4

모듈의 코드 라인의 많은 양을 가질 수 있습니다.

내가 보는 것은 main_script.py를 실행할 때 모듈을 가져 오는 데 약 4-5 초가 걸리는 것입니다.

pyc.py를 사용하여 dll의 모든 모듈을 컴파일하고 ngen을 사용하려고했지만 myEngine.Runtime.LoadAssembly()를 사용하여이 dll을 추가 할 때 차이점을 발견하지 못했습니다.

그런 다음 pyc 파일을 가져 오기 위해 py_compile.py를 사용하려고했지만 IronPython.Runtime.FunctionCode 유형이 IronPython.Modules.MarshalWriter 클래스 (WriteObject (object o))에서 지원되지 않는 것으로 보입니다. (컴파일 할 때 "unmarshallable object"예외가 발생했습니다.)

저는 파이썬이나 IronPython에 익숙하지 않고 어쩌면 언어의 모든 미묘함을 이해하지 못했습니다. 솔루션을 찾기 위해 인터넷을 검색하지만 지금 당장 붙어있는 것 같아요.

가져 오기 성능을 향상시킬만한 아이디어가 있습니까?

답변

2

IronPython 2.7.1에서 가져 오기 작업을 수행하는 데 4-5 초가 소요됩니다 (특히 대형 모듈의 경우). 필자는 pyc.py를 개선하려고했지만, 이전만큼 유용하지는 않다고 생각합니다. IronPython의 가져 오기가 이전보다 훨씬 빠르기 때문에 pyc.py는 덜 유용합니다.

IronPython은 모듈 [1]을 가져올 때 Python이하는 것보다 훨씬 많은 일을합니다. 파이썬은 그것을 파싱하고 바이트 코드를 생성해야만합니다. IronPython은 인터프리터 명령어로 변환 된 DLR 트리를 생성해야하며, 컴파일 제한을 초과하는 경우 일리노이 또한 .NET JIT를 실행하여 기계 코드를 생성합니다.

스크립트를 실행하는 데 몇 초 밖에 걸리지 않으면 모든 작업이 낭비됩니다. IronPython은 장기 실행 프로세스에 더 좋습니다. 그러나 짧은 Python 스크립트는 매우 일반적이며 IronPython은 이러한 종류의 스크립트에 대해 극히 형편 없습니다.

우리가이 문제를 해결하기 위해 노력하고있는 두 가지 방법이 있습니다. 그 중 하나는 당신이 암시 한 것입니다. 시작 시간에 최적화되었지만 처리량에 최적화 된 인터프리터로 표준 .pyc 파일을 지원하기위한 작업이 진행 중입니다. 짧은 스크립트는 효과적이지만 장기 실행 코드는 어려움을 겪을 것입니다. 둘째, IronPython을 모바일 플랫폼으로 이식하려면 동적 코드 생성을 비활성화해야하므로 DLR 인터프리터를 빠르게 만드는 것이 매우 중요합니다. 이 작업으로 컴파일되지 않은 코드가 더 빨리 시작될 것입니다.

우리가 극복 할 수없는 한 가지는 .NET 프로세스가 일반적으로 일반 C 인스턴스보다 시작하는 데 더 오래 걸린다는 사실입니다. 오버 헤드를 줄일 수는 있지만 꽤 오랜 시간 동안 최적화가 필요합니다.

[1] Python의 가져 오기 프로세스가 너무 빠르기 때문에 파일을 찾기 위해 stat 호출은 &을 컴파일 할 때보 다 훨씬 빠릅니다.

+0

확인. 답변 해 주셔서 감사합니다. 매우 명확합니다. 효과적으로 스크립트는 매우 짧기 때문에 스크립트를 실행하는 것보다 모듈을 가져 오는 데 더 많은 시간이 걸리는 경우가 있습니다. 필자의 주요한 문제는 어떤 경우에는 수백 개의 스크립트를 실행해야하며 매번 가져 오기 프로세스를 수행해야한다는 것입니다. 하지만 어쨌든, 귀하의 답변에 대해 대단히 감사드립니다. – GradlonGwen

+0

질문을 표현한 방식에 따라 C# 응용 프로그램에 IPy를 포함한다고 가정합니다. 가져온 것을 하나의 스코프로 처리하려고 시도한 다음 스크립트에서 가져올 수있는 전역 모듈로 해당 스코프를 사용했습니다. 그게 더 나은 성능을 얻을 수 있을까요? 또는 스크립트가 남은 변수에 의해 오염되지 않는다고 확신하는 경우 스크립트 범위를 다시 사용할 수 있습니다 (즉, 스크립트에서 직접 변수를 다시 초기화해야 함). – Vassi

+0

늦게 응답하여 죄송합니다. 다른 과목에서 일하기. 우리 시스템 덕분에 모든 스크립트가 전역 모듈로 사용될 스코프를 만들 수 없습니다. 왜냐하면 각 스크립트는 실행 후 죽은 다른 프로세스에서 실행되기 때문입니다. 우리는 파이썬에서 메모리 관리에 문제가 있습니다. (많은 양의 데이터가 garbaged되지 않고 이유를 알지 못합니다.) 우리가 발견 한 유일한 해결책은 각 스크립트를 분리 프로세스에서 실행하는 것입니다. – GradlonGwen