2012-04-27 35 views
6

Đây là vấn đề cơ bản của tôi:quá tải Python hàm toán học sử dụng Cython

Tôi có một tập tin Python bằng cách nhập của

from math import sin,cos,sqrt 

tôi cần tập tin này để vẫn là 100% CPython tương thích để cho phép các nhà phát triển của tôi để viết 100% mã CPython và sử dụng các công cụ tuyệt vời được phát triển cho Python.

Bây giờ, hãy nhập Cython. Trong tệp Python của tôi, các hàm trig được gọi là hàng triệu lần (cơ bản cho mã, không thể thay đổi điều này). Có cách nào mà thông qua một số Python-fu trong file python chính, hoặc Cython kỳ diệu nếu không tôi thay vì có thể sử dụng C/C++ hàm toán học sử dụng một số biến thể của mã Cython

cdef extern from "math.h": 
    double sin(double) 

Điều đó sẽ cho tôi gần bờ C hiệu suất, mà sẽ là tuyệt vời.

Stefan's talk nói đặc biệt này không thể được thực hiện, nhưng nói là hai tuổi, và có rất nhiều những người sáng tạo ra có

+3

Tôi khá chắc chắn CPython đã sử dụng các chức năng này trong nội bộ. Tại sao họ sẽ reimplement hoạt động toán học cơ bản? – ThiefMaster

+4

Nếu bạn định gọi hàm trig cho số lượng lớn các giá trị, hãy xem xét đóng gói các giá trị đó trong các mảng Numpy và gọi 'np.sin' và bạn bè. –

+0

@ThiefMaster - Đã xem mã .c mà Cython đã tạo từ tệp của tôi đã nhập hàm sqrt, nó không sử dụng các phiên bản math.h, là điều không may – ibell

Trả lời

2

Tôi không phải là một chuyên gia Cython, nhưng AFAIK, tất cả các bạn có thể làm là viết một wrapper Cython xung quanh sin và gọi đó. Tuy nhiên, tôi không thể tưởng tượng rằng nó sẽ nhanh hơn math.sin vì nó vẫn sử dụng các ngữ nghĩa gọi là Python - chi phí trong tất cả các công cụ Python để gọi hàm, chứ không phải tính toán trig thực tế, được thực hiện trong C khi sử dụng CPython quá.

Bạn đã cân nhắc sử dụng Cython pure mode, điều này có làm cho nguồn tương thích với CPython không?

+0

Chính xác, tôi đang cố gắng thực hiện nó ở chế độ Python thuần túy . Có vẻ như, và tôi nghĩ rằng tôi có thể xác minh điều này, rằng Cython không làm phép thuật dưới mui xe để sử dụng các hàm 'math.h'. – ibell

+0

EDIT: Cython không sử dụng các hàm toán học c/C++, ngay cả khi các biến được gõ tĩnh. – ibell

+2

@ibell: khi bạn nhập chúng một cách rõ ràng: 'từ libc.math cimport sqrt'. –

0

tôi có thể đã hiểu lầm vấn đề của bạn, nhưng Cython documentation on interfacing with external C code dường như cho thấy cú pháp sau:

cdef extern from "math.h": 
    double c_sin "sin" (double) 

mang đến cho các chức năng tên sin trong mã C (vì vậy mà nó liên kết một cách chính xác để hàm từ math.h) và c_sin trong mô-đun Python. Tôi không thực sự chắc chắn tôi hiểu những gì điều này đạt được trong trường hợp này, mặc dù - tại sao bạn sẽ muốn sử dụng math.sin trong mã Cython? Bạn có một số biến được nhập tĩnh và một số biến được nhập động không?

+0

Thật không may, trừ khi tôi thiếu một cái gì đó, nó sẽ không thực sự làm điều đó. Tôi đã thử thêm nó vào tập tin PXD của tôi trên một ý thích, nhưng nó dường như không hoạt động. Cám ơn sự giúp đở cuả bạn. – ibell

2

Trong một example từ tài liệu Cython, họ sử dụng một cimport từ một thư viện C để đạt được điều này:

from libc.math cimport sin 
+0

Nhưng quá trình nhập này không ghi đè quá trình nhập từ thư viện python ở chế độ python thuần túy – ibell

+0

Tại sao bạn không truy vấn người dùng đối số dòng lệnh hoặc tham số hàm cho biết mã của bạn cho dù bạn đang chạy trong python hay Cython, và sau đó cho phù hợp nhập khẩu hàm 'sin' thích hợp? –