2011-12-30 30 views
9

Tôi đang phát triển một ứng dụng C++ được mở rộng/viết bằng Python. Tất nhiên C++ nhanh hơn nhiều so với Python, nhưng điều đó có nghĩa là bạn nên thực thi mã C++ trên mã Python càng thường xuyên càng tốt?Giá kiểm soát chuyển đổi giữa C++ và Python

Tôi hỏi điều này bởi vì tôi không chắc chắn, liệu có bất kỳ chi phí hiệu suất nào để điều khiển chuyển đổi giữa mã được viết bằng C++ và mã được viết bằng Python không? Tôi có nên sử dụng mã được viết bằng C++ trong mọi dịp hay tôi nên tránh gọi lại C++ cho các tác vụ đơn giản vì bất kỳ tốc độ nào bạn có thể có từ việc thực thi mã C++ đều bị chi phối bởi chi phí chuyển đổi giữa các ngôn ngữ?

Chỉnh sửa: Tôi nên làm rõ điều này, tôi không yêu cầu điều này thực sự giải quyết được sự cố. Tôi yêu cầu hoàn toàn tò mò và đó là điều đáng ghi nhớ trong tương lai. Vì vậy, tôi không quan tâm đến các giải pháp thay thế, tôi chỉ muốn biết câu trả lời, từ quan điểm kỹ thuật. :)

+0

Đây có phải là tùy chọn để viết ứng dụng chính trong Python và sử dụng C++ để viết một mô-đun Python mà ứng dụng của bạn có thể sử dụng không? Sau đó, chi phí chuyển đổi ngôn ngữ phải bằng không. –

Trả lời

1

Chi phí hiện tại nhưng không đáng kể. Đó là bởi vì bạn có thể làm một chút công bằng để chuyển đổi các kiểu dữ liệu mức cao của python thành các biểu diễn tương thích với C++. Tất nhiên điều này tương tự như chi phí gọi một hàm C++ từ một hàm khác, có một số chi phí. Các quy tắc cho thời đó là một ý tưởng tốt để chuyển từ python C++ là:

Một chức năng với vài đối số

Một chức năng mà hiện một số lượng lớn các xử lý trên một lượng nhỏ dữ liệu

Một chức năng được gọi là hiếm càng tốt - chức năng củng cố gọi nếu có thể

+1

Theo thứ tự: 1. Số đối số phải làm gì với bất kỳ thứ gì? 2. Điều gì về một số lượng lớn xử lý trên một số lượng * lớn *? C++ không thể làm điều đó? 3: Nếu nó hiếm khi được gọi, tại sao trên trái đất bạn sẽ đi qua nỗ lực to lớn của việc chuyển đổi nó sang C++? Có vẻ như bạn nên tập trung vào những người thực sự ăn lên thời gian xử lý. –

+1

@Chris: 1. Như Dan nói, nó thường là các đối số truy cập khá vụng về từ một thông dịch viên. Nếu bạn cần một hàm lấy một trăm đối số dạng số để trả về tổng của chúng, thì sẽ không có nhiều ý nghĩa khi gọi đến thực thi C++. Cùng một hướng dẫn khái niệm "lớn ... xử lý ... nhỏ ... dữ liệu" - nếu bạn có thể vượt qua mã C++ ít đối số hơn (ngay cả khi chúng được nói mảng lớn) và nó làm một cái gì đó phức tạp như nói nhận dạng ký tự quang học trên dữ liệu , thì rất có khả năng thực hiện/gọi điện trong C++. –

+1

@Chris: 3. "hiếm khi có thể _possible_" - giả sử mỗi hàng tỷ lượt đi qua một vòng lặp chặt chẽ cần thiết để áp dụng một số hàm toán học phức tạp, lạ đến 20 giá trị. Xem xét hợp nhất các cuộc gọi C++ để một cuộc gọi vào C++ được cung cấp tất cả 20 giá trị cùng một lúc, trả về kết quả của chúng cùng nhau. –

0

Các số liệu tốt nhất nên là cái gì đó wieghs lên cho bạn ....

  • Làm cho phát triển, gỡ lỗi và kiểm tra dễ dàng hơn (giảm chi phí dev)
  • Giảm chi phí bảo trì
  • đáp ứng yêu cầu về hiệu suất (cung cấp giải pháp)
7

tôi không biết có một quy tắc cụ thể cho điều này, nhưng nguyên tắc chung mà nhiều người sau là:

  • Nguyên mẫu trong python. Viết nhanh hơn và có thể là dễ đọc/lý do hơn.
  • Một khi bạn có một mẫu thử nghiệm, bây giờ bạn có thể xác định các phần chậm nên được viết bằng C++ (thông qua lược tả).
  • Tùy thuộc vào miền của mã của bạn, các bit chậm thường được phân tách thành các loại mã 'vòng lặp bên trong', vì vậy số lượng chuyển đổi giữa python một mã này phải tương đối nhỏ.
  • Nếu chương trình của bạn đủ nhanh, bạn đã tránh thành công tối ưu hóa mã của mình bằng cách viết quá nhiều vào C++.
+1

Điều này là thiên vị, như thể mọi ứng dụng được viết tốt hơn bằng Python. Python không quy mô (trong dòng mã hoặc hiệu suất hoặc xử lý dữ liệu) theo cách C++ làm và không phù hợp với nhiều ứng dụng mà C++ được đặt. Câu hỏi cho thấy một chương trình C++ hiện có cần một số giải thích thời gian chạy cho khả năng tùy biến. "nhanh hơn để viết, dễ đọc/lý do" chỉ là vô nghĩa - với python dễ dàng hơn khi tìm thư viện để bắt đầu về các vấn đề lớp "chưa khác" nhanh hơn, nhưng môi trường C++ trưởng thành với các thư viện được tùy chỉnh cho công việc có thể tốt hơn nữa. –

+0

@Tony, dễ đọc nói chung là chủ quan (Đó là lý do tại sao tôi nói không có quy tắc cụ thể), và tôi chắc chắn nó (python) không phù hợp với mọi miền của vấn đề. Đối với những điều tôi đã làm việc trên, tuy nhiên, nó đã thu nhỏ độc đáo về LOC và biểu cảm. Một lưu ý cuối cùng về thiên vị ... hầu hết những điều c/C++ tôi nhìn rất khó đọc đối với tôi, nhưng đó có lẽ là vì tôi là một anh chàng python. Hồ sơ của bạn nói rằng bạn là một anh chàng C++ rất nhiều, vì vậy mà sẽ giải thích ý kiến ​​của bạn. –

+0

Ngoài ra, câu hỏi này là yêu cầu cho một câu trả lời thiên vị, như không có ai (mà không nhìn thấy chương trình chính xác của mình) có thể nói chắc chắn tùy chọn * tốt nhất * cho anh ta. –

2

Giữ đơn giản và điều chỉnh hiệu suất khi cần. Lý do chính để nhúng trình thông dịch vào ứng dụng C++ là cho phép cấu hình/dữ liệu thời gian chạy để chỉ định một số xử lý - tức là bạn có thể sửa đổi tập lệnh mà không cần biên dịch lại chương trình C++ - đó là hướng dẫn của bạn khi nào cần gọi vào trình thông dịch.Một khi trong một số cuộc gọi thông dịch viên, những lý do chính để gọi lại vào C++ là:

  • để truy cập hoặc cập nhật một số dữ liệu có thể không hợp lý được tiếp xúc như một tham số để gọi (hoặc thông qua một số quá trình đăng ký khác người phiên dịch hỗ trợ)
  • để có được hiệu suất tốt hơn trong một số phần quan trọng của quá trình xử lý

Đối với sau này, hãy thử kịch bản đầu tiên (giả sử nó là dễ dàng để phát triển ở đó), sau đó nếu nó chậm xác định ở đâu và như thế nào một số C++ mã có thể hữu ích. Nếu/nơi hiệu suất không chứng minh một vấn đề - như là một hướng dẫn chung khi gọi từ C + + để thông dịch viên hoặc ngược lại: cố gắng xếp hàng càng nhiều công việc càng tốt sau đó thực hiện cuộc gọi vào hệ thống khác. Nếu bạn gặp khó khăn, hãy quay trở lại stackoverflow với một vấn đề cụ thể và mã thực tế.

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