2015-09-15 7 views
6

मेरे पास एक सीएलआई एप्लिकेशन है जिसके लिए sympy की आवश्यकता है। सीएलआई आवेदन की गति महत्वपूर्ण है - इसका उपयोग उपयोगकर्ता फ़ीडबैक लूप में बहुत अधिक होता है।क्या आयात को गति देने का कोई तरीका है?

हालांकि, बस import sympyएक पूर्ण दूसरा लेता है। यह एक कड़े फीडबैक लूप में अविश्वसनीय रूप से परेशान हो जाता है। मॉड्यूल में बदलाव किए बिना स्क्रिप्ट फिर से चलाने पर मॉड्यूल को 'प्रीलोड' या ऑप्टिमाइज़ करने के लिए वैसे भी है?

+1

ऐसा लगता है कि 'sympy' devs इस मुद्दे से अवगत हैं। एक [पुरानी बग रिपोर्ट] है (https://github.com/sympy/sympy/issues/3396), और ['sympy/__ init __। Py'] में कई टिप्पणियां भी हैं (https://github.com/sympy /sympy/blob/master/sympy/__init__.py) धीमी आयात का जिक्र करते हुए। शायद एक मुद्दा फिर से दर्ज करें? (यह सुनिश्चित करने के बाद कि आप सबसे हालिया संस्करण का उपयोग कर रहे हैं) –

+0

अपने सीएलआई एप्लिकेशन को फिर से लिखें ताकि आप इसे केवल एक बार चला सकें, फिर भी इसे कई अलग-अलग इनपुट खिलाएं ...? – twalberg

+0

@twalberg उस बिंदु पर यह अब एक सीएलआई आवेदन नहीं है। अधिक विशिष्ट होने के लिए, मेरा आवेदन एक भाषा दुभाषिया है। – orlp

उत्तर

3

स्पष्ट रूप से sympy आयात किए जाने पर बहुत कुछ करता है। यह आंतरिक डेटा संरचनाओं या इसी तरह के प्रारंभिक हो सकता है। आप इसे sympy लाइब्रेरी के डिज़ाइन में एक दोष कह सकते हैं।

इस मामले में आपकी एकमात्र पसंद से बचने के लिए इस प्रारंभिकरण को फिर से शुरू कर देगी।

मुझे लगता है कि आपको यह व्यवहार परेशान लगता है क्योंकि आप इसे अक्सर करना चाहते हैं। मैं अक्सर इसे करने से बचने का प्रस्ताव करता हूं। इसे प्राप्त करने का एक तरीका एक सर्वर बनाना है जो केवल एक बार शुरू हो गया है, इसके स्टार्टअप पर sympy आयात करता है, और फिर एक सेवा प्रदान करता है (इंटरप्रोसेस संचार के माध्यम से) जो आपको sympy के साथ जो कुछ भी करना है, वह करने की अनुमति देता है।

यदि यह आपके लिए एक विकल्प हो सकता है, तो मैं यह कैसे कर सकता हूं इस पर विस्तार से बता सकता हूं।

+0

मुझे लगता है कि यह ओवर-इंजीनियरिंग होगा, और क्रॉस-प्लेटफार्म बनाने के लिए नाजुक होगा। क्या एक दुभाषिया राज्य (आयात करने के बाद) 'स्नैपशॉट' करने का कोई तरीका नहीं है, और पूरे दुभाषिया स्थिति को डिस्क से लोड करें? – orlp

+0

कोई भी जो मुझे पता है। मेरे कई वर्षों के लैपटॉप पर, बीटीडब्ल्यू, मुझे 'सिम्पी' आयात करने के लिए केवल एक सेकंड का एक अंश चाहिए। – Alfe

+0

* "डिस्क से संपूर्ण दुभाषिया स्थिति लोड करें" * - [एएसएलआर] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) कई कारणों में से एक है क्यों यह काम नहीं करेगा। –

0

आपको जांचना चाहिए कि कोड में उपयोग किए जा रहे मॉड्यूल को केवल लोड करने का समय सुधारता है या नहीं।

आईई:

from sympy import mod1, mod2, mod3 

बनाम

import sympy 

आप पढ़ना चाहिए इन पिछले प्रश्न:

Python import X or from X import Y? (performance)

improving speed of Python module import

'import module' vs. 'from module import function'

+0

मैं पहले से ही यह कर रहा हूं, और यह बिल्कुल कोई फर्क नहीं पड़ता है। – orlp

+0

हम्म ... शायद आपको साइड सर्वर का उपयोग करके बेहतर परिणाम मिलेगा, क्योंकि अल्फ़ ने आपको बताया था ... –

1

मैं क्या होता है जब आप आयात sympy चलाने पर एक दृष्टि डाली, और यह sympy के सभी आयात करता है।

https://github.com/sympy/sympy/blob/master/sympy/__init__.py

आप केवल sympy के कुछ भागों का उपयोग कर रहे हैं, तो केवल उन भागों है कि आप की जरूरत आयात करते हैं।

यह अच्छा होगा अगर आप ऐसा कर सकता है:

import sympy.sets 

लेकिन (आप बाहर बिंदु के रूप में) है कि आयात sympy और फिर सेट करता है।

एक समाधान अपने स्वयं के आयातक को लिखना है। आप इसे आईपी मॉड्यूल की मदद से कर सकते हैं।

import imp 
sets = imp.load_module("sets", open("sympy/sets/__init__.py"), "sympy/sets/__init__.py", ('.py', 'U', 1)) 

लेकिन, यहां तक ​​कि यह पर्याप्त अनुकूलित नहीं हो सकता है।sympy/sets/__init__.py पर एक नज़र ले रहा है मुझे लगता है कि यह करता है यह:

from .sets import (Set, Interval, Union, EmptySet, FiniteSet, ProductSet, 
    Intersection, imageset, Complement, SymmetricDifference) 
from .fancysets import TransformationSet, ImageSet, Range, ComplexRegion 
from .contains import Contains 
from .conditionset import ConditionSet 

हो सकता है कि आप केवल सेट मॉड्यूल आयात कर सकते हैं simpy नाम स्थान सेट से?

import imp 
sets = imp.load_module("sets", open("sympy/sets/set.py") "sympy/sets/set.py", ('.py', 'U', 1)) 
+0

यह दुख की बात बिल्कुल काम नहीं करती है, क्योंकि 'आयात sympy.sets' अकेले' sympy/__ init__ चलाएगा। पीई', जो सब कुछ आयात करता है। – orlp

+0

वास्तव में, मुझे खेद है। – jrwren

संबंधित मुद्दे

 संबंधित मुद्दे