2015-09-15 17 views
6

Tôi có một ứng dụng CLI yêu cầu sympy. Tốc độ của ứng dụng CLI quan trọng - nó được sử dụng rất nhiều trong vòng lặp phản hồi của người dùng.Có cách nào để tăng tốc độ nhập không?

Tuy nhiên, chỉ cần thực hiện import sympychiếm toàn bộ giây thứ hai. Điều này cực kỳ khó chịu trong một vòng phản hồi chặt chẽ. Có anyway để 'preload' hoặc tối ưu hóa một mô-đun khi một kịch bản được chạy một lần nữa mà không cần thay đổi module?

+1

Có vẻ như các nhà phát triển 'sympy' biết vấn đề này. Có một [báo cáo lỗi cũ] (https://github.com/sympy/sympy/issues/3396) và cũng có một số nhận xét trong ['sympy/__ init __. Py'] (https://github.com/sympy /sympy/blob/master/sympy/__init__.py) đề cập đến việc nhập khẩu chậm. Có thể lại xảy ra sự cố? (Sau khi đảm bảo rằng bạn đang sử dụng phiên bản mới nhất) –

+0

Viết lại ứng dụng CLI của bạn để bạn có thể chạy nó một lần, nhưng hãy nạp nhiều đầu vào khác nhau ...? – twalberg

+0

@twalberg Vào thời điểm đó, nó không còn là ứng dụng CLI nữa. Để cụ thể hơn, đơn của tôi là một thông dịch viên ngôn ngữ. – orlp

Trả lời

3

Rõ ràng sympy thực hiện rất nhiều khi được nhập. Nó có thể khởi tạo các cấu trúc dữ liệu nội bộ hoặc tương tự. Bạn có thể gọi đây là lỗi trong thiết kế của thư viện sympy.

Lựa chọn duy nhất của bạn trong trường hợp này là tránh làm lại quá trình khởi tạo này.

Tôi cho rằng bạn thấy hành vi này gây phiền nhiễu vì bạn định làm điều đó thường xuyên. Tôi đề nghị tránh làm việc đó thường xuyên. Một cách để đạt được điều này có thể là tạo một máy chủ được khởi động chỉ một lần, nhập sympy khi khởi động, và sau đó cung cấp một dịch vụ (thông qua liên lạc truyền thông) cho phép bạn làm bất cứ điều gì bạn muốn làm với sympy.

Nếu đây có thể là một lựa chọn cho bạn, tôi có thể giải thích cách thực hiện điều này.

+0

Tôi cảm thấy như vậy sẽ là quá kỹ thuật nó, và khá mong manh để làm cho nền tảng chéo. Không có cách nào để 'chụp nhanh' một trạng thái thông dịch viên (sau khi nhập), và tải toàn bộ trạng thái thông dịch từ đĩa? – orlp

+0

Không ai mà tôi biết. Trên máy tính xách tay của tôi vài năm tuổi, btw, tôi chỉ cần một phần nhỏ của một giây để nhập khẩu 'sympy'. – Alfe

+0

* "tải toàn bộ trạng thái thông dịch từ đĩa" * - [ASLR] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) chỉ là một trong nhiều lý do khiến nó không hoạt động. –

0

Bạn nên kiểm tra xem chỉ nhập các mô-đun mà bạn đang sử dụng trong mã sẽ cải thiện thời gian tải.

IE:

from sympy import mod1, mod2, mod3 

vs

import sympy 

Bạn nên đọc những câu hỏi này trước:

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

improving speed of Python module import

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

+0

Tôi đã làm điều này, và nó hoàn toàn không có sự khác biệt. – orlp

+0

Hmm ... có lẽ bạn sẽ nhận được kết quả tốt hơn khi sử dụng máy chủ phụ, như Alfe đã nói với bạn ... –

1

tôi đã xem xét những gì sẽ xảy ra khi bạn chạy sympy nhập khẩu, và nó nhập khẩu tất cả các sympy.

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

Nếu bạn chỉ sử dụng một số phần của sympy, sau đó chỉ nhập khẩu những bộ phận mà bạn cần.

Nó sẽ được tốt đẹp nếu bạn có thể làm điều này:

import sympy.sets 

Nhưng (như bạn chỉ ra) rằng hàng nhập khẩu sympy và sau đó đặt.

Một giải pháp là viết nhà nhập khẩu của riêng bạn. Bạn có thể làm điều này với sự giúp đỡ của mô-đun imp.

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

Nhưng, ngay cả điều đó có thể không tối ưu hóa đủ.Lấy một cái nhìn tại sympy/sets/__init__.py tôi thấy rằng nó thực hiện điều này:

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 

Có lẽ bạn chỉ có thể nhập các mô-đun bộ từ simpy đặt namespace?

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

Điều này thật đáng buồn không hoạt động chút nào, vì 'import sympy.sets' sẽ chạy' sympy/__ init__. py', mà nhập khẩu tất cả mọi thứ. – orlp

+0

thực sự, tôi xin lỗi. – jrwren

Các vấn đề liên quan