Tại sao Python không C? [đóng cửa]


7

Tôi thích cách thụt lề bắt buộc của Python mà nhiều người không thích vì tôi ghét kiểu đánh dấu cha mẹ và dấu chấm phẩy thừa. Tôi thích giao diện shell, nhưng tại sao một số người nghĩ Python thực tế cho việc học máy?

Ngay cả với kích hoạt tuyến tính được chỉnh lưu thẳng, vì tính đa chiều, các mạch mô phỏng bao gồm các nơ-ron nhân tạo đặt ra yêu cầu lớn đối với tài nguyên điện toán. Xử lý video trong thuật toán mạng nhân tạo đối nghịch điển hình đòi hỏi bảy vòng lặp lồng nhau.

  • Lặp lại cặp nghịch cảnh
  • Độ sâu lớp lưới thần kinh
  • Chỉ số mẫu
  • Chỉ số khung
  • Độ sâu pixel
  • Theo chiều dọc
  • Ngang

Chúng tôi gọi bộ lọc để tích chập là "hạt nhân" và xử lý nó cho DSP trong GPU để giảm hiệu năng sau đó sử dụng ngôn ngữ kịch bản để mã hóa.

Tại sao chúng ta không viết mã học sâu như Linus Torvalds viết mã hạt nhân, gcc -Svì vậy chúng ta có thể đảm bảo ngôn ngữ lắp ráp hiệu quả và hầu như không có lỗi nhớ cache? Từ quan điểm hiệu suất, người ta có thể bay lên mặt trăng và quay lại với C trước khi Python thậm chí phá vỡ dòng cây.

Về mặt dễ dàng thử nghiệm, C ++ có nhiều đối tượng được định hướng để các tóm tắt sạch có thể được viết dưới dạng tệp .hpp để định cấu hình và chi phối C hiệu quả hạt nhân thực hiện cơ chế tối ưu hóa tham số.

Chúng tôi gõ trên bàn phím để viết mã và khối, chúng tôi lập trình lò vi sóng và một số người trong chúng tôi chơi các bàn phím âm nhạc mô phỏng độc đáo cây đàn piano. Sau đó chúng ta quên nó là C / C ++ bên dưới các giao diện người dùng rất trực quan này. Tôi thẳng thắn, không mua đối số Python.

Hầu hết chúng ta đều hiểu rằng các trình bao bọc Python đã được tạo ra xung quanh các thuật toán ma trận hiệu quả được viết bằng FORTRAN và được chuyển sang C, và các cấu trúc Python cho ML tương đối thanh lịch, nhưng đó là lý do chính đáng để loại bỏ thực tế là nhiều thư viện C ++ cho ML đó cũng là thanh lịch đã được phát triển?


2
Ý thức của tôi luôn luôn là lợi thế chính của Python là nó là một ngôn ngữ được dịch mang lại một loại linh hoạt / tính linh hoạt phát triển mà bạn không có được với các ngôn ngữ được biên dịch.
DukeZhou

Python dễ hơn c và bạn có thể sử dụng python nhiều hơn v
AIDANMAKU 20/07/18

Python rất dễ hiểu. Chúng ta cần nhiều tâm trí hơn để giải quyết vấn đề. Với python, nhiều người có thể học hỏi và cộng đồng mở rộng.
Guilherme IA

Câu hỏi tương tự bên ngoài: quora.com/Why-is-C++-not-a-good-lingu-for-machine-learning . Tính đến ngày 22 tháng 7 năm 2018, Github.com có ​​1.657 dự án trong C ++ cho máy học: github.com/ . Tensorflow là một trong số đó. Có các bài viết học thuật cho các phương pháp tiếp cận C ++ ML: MLC ++, DLibML, MLPack, LibDAI, Showgun, Bob, OptiML, và vài trăm bài nữa ( scholar.google.com/scholar?q=machine+learning+c%2B%2B ).
FauChristian

Câu trả lời:


4

Bởi vì có một thư viện cho Python tên NumPy .

Nó có thể thực hiện các tính toán cực kỳ nhanh chóng trên các mảng số n chiều và tất cả các loại thư viện khoa học / máy học / xử lý hình ảnh, vv được xây dựng trên đầu trang.

Bạn không thực hiện tính toán thực tế trong forcác vòng lặp Python , điều đó thực sự rất chậm. Bạn gọi các hoạt động ma trận Numpy và chúng được viết bằng C (và một phần bằng Fortran nếu tôi nhớ lại chính xác, không chắc đó có phải là trường hợp không) và được tối ưu hóa không thương tiếc cho tốc độ trong nhiều năm.


4

Điều bạn có thể đang tìm kiếm là:

nhập mô tả hình ảnh ở đây

Hãy cho chúng tôi xem câu hỏi này từ 2 quan điểm:

Người mới bắt đầu: Từ quan điểm của người mới bắt đầu, anh ta cần hiểu cách triển khai một mô hình trước khi tối ưu hóa nó. Trước tiên anh ta cần phải hình dung mô hình, xem các loại lỗi xuất hiện, thử nghiệm với mô hình để có thêm trực giác. Chắc chắn có thể có trong C / C ++. Nhưng nó có đáng không? Thời gian người đó sẽ viết / gỡ lỗi mã trong C / C ++ sẽ vượt xa thời gian để tạo i trong Python / MATLAB / R. Vì vậy, sau khi anh ta đạt được một số kiến ​​thức thực hiện trung gian thì anh ta có thể tiếp tục với C / C ++.

Chuyên gia: Theo chuyên gia, ý tôi là chuyên gia lập trình. Họ chắc chắn và dễ dàng sử dụng C / C ++. Nhưng thông tin chính mà bạn đã bỏ lỡ là TensorFlow, một thư viện ML và cũng đóng vai trò cốt lõi cho các thư viện ML cấp cao khác như Keras được lập trình trong chính C ++. Đây là thông tin thêm về nó. Vì vậy, nếu tôi không sai thì TensorFlow tạo một biểu đồ tính toán trước khi lấy bất kỳ dữ liệu nào, và sau đó chạy biểu đồ đó trên dữ liệu thường được tải hoàn toàn trong RAM. Vì vậy, không có sự can thiệp của Python ở giữa.

Ngoài ra khả năng đọc mã là một vấn đề lớn (ít nhất là tôi phải đối mặt với nó), thuật toán Viết ML trong C / C ++ sẽ mất một lượng lớn mã có thể trở nên không thể đọc được nếu bạn nhìn vào nó sau một tuần hoặc lâu hơn nếu không được ghi chép lại. Trong khi đó do các chức năng python sẵn có, bạn có thể dễ dàng đọc chương trình.

Lời khuyên từ chuyên gia về Machine Learning Andrew Ng, hãy sử dụng các ngôn ngữ như C / C ++ để triển khai mô hình của bạn sau khi bạn xác minh mô hình của mình hoạt động với ngôn ngữ cấp cao hơn như MATLAB.

Ngoài ra, vì hỗ trợ thư viện được đề cập @FauChristian là hoàn hảo, bạn có thể kết hợp nhiều thư viện khác trong các lĩnh vực khác để chuyển đổi dữ liệu thành dạng ML sau đó sẽ được sử dụng trong mô hình ML của bạn.


2

Trong AI (và có lẽ nhiều lĩnh vực khác nữa), thời gian dành cho các lập trình viên của con người có xu hướng có giá trị / đắt hơn đáng kể so với thời gian chạy chương trình. Tất nhiên điều này không phải lúc nào cũng đúng (giống như không phải lúc nào Python cũng được sử dụng chứ không phải C hay C ++), nhưng nó thường đúng.

Đặc biệt trong trường hợp nghiên cứu, điều cực kỳ quan trọng là có thể lặp lại ý tưởng một cách nhanh chóng. Chúng ta cần có khả năng nhanh chóng thực hiện các ý tưởng mới, thử nghiệm chúng, có thể trải qua một vài lần lặp lại lỗi, kiểm tra lại, v.v ... Rất hiếm khi nút cổ chai trong lần lặp ý tưởng này là thời gian chạy của một ý tưởng / thuật toán mới. Thời gian dành cho việc lập trình của con người có xu hướng trở thành nút cổ chai thường xuyên hơn. Các ý tưởng thường có thể được kiểm tra nhanh chóng đối với các sự cố đồ chơi nhỏ dù không mất nhiều thời gian chạy hoặc chạy qua đêm / chạy trong khi lập trình viên bận viết mã khác.

Làm tất cả những gì lặp đi lặp lại, thực hiện nhanh chóng các ý tưởng mới, v.v ... có xu hướng dễ dàng hơn / nhanh hơn trong Python so với C hoặc C ++. Tất nhiên điều này không nhất thiết đúng với mọi người, nếu ai đó đã có nhiều kinh nghiệm về C ++ và ít kinh nghiệm về Python, họ có thể thực hiện các ý tưởng mới nhanh hơn trong C ++. Điều này dường như không phải là trường hợp cho phần lớn mọi người. Những lợi thế rõ ràng mà Python có về mặt nhanh chóng có thể thực hiện những ý tưởng mới bao gồm:

  • Ít dài dòng hơn, không cần nhập nhiều (ví dụ: results = []trong Python so với std::vector<double> results;C ++ để tạo một danh sách trống mà chúng ta có thể bắt đầu nối thêm một số kết quả vào một thử nghiệm).
  • Không cần phải lo lắng về quản lý bộ nhớ, con trỏ, tất cả những thứ có thể thực hiện được bằng kinh nghiệm nhưng chắc chắn cần phải chú ý, có nhiều khả năng dẫn đến lỗi thêm, v.v.
  • Không cần phải trải qua quá trình biên dịch / xây dựng . Đây có thể là một cái rất lớn, rất dễ quên.
  • Ít rắc rối hơn khi có các cấu trúc dữ liệu chứa các loại thuộc các loại khác nhau (ví dụ: config = {'algorithm': 'RandomForest', 'n_trees': 50}trong Python vs .... không có ý tưởng nào trong C ++)

Một điểm quan trọng khác là phần lớn mã mà mọi người trong AI viết không phải là các phần nhạy cảm với hiệu suất . Một lần nữa, có thể không đúng với tất cả mọi người, nhưng đúng là đặc biệt trong các thiết lập nghiên cứu. Hầu hết các nhà nghiên cứu không dành phần lớn thời gian của họ để viết mã cho các lần chuyển tiếp / lùi trong Mạng thần kinh. Họ dành nhiều thời gian hơn cho những thứ như:

  • Dữ liệu tiền xử lý (không phải lúc nào cũng dễ dàng viết mã có thể sử dụng lại dễ dàng, các đoạn quan trọng sẽ là đặc thù của dự án / dữ liệu cụ thể)
  • Thiết lập thử nghiệm (ví dụ: vòng lặp đào tạo bên ngoài, kết quả in / ghi nhật ký, ...)
  • Xử lý kết quả, tạo ra tất cả các loại lô ưa thích, vv
  • Các thuật toán hoàn toàn mới (một phần của) (ví dụ: một biến thể mới trong danh sách SGD / RMSProp / ADAM / v.v., có thể chỉ là một vài dòng mã đơn giản có thể được cắm thẳng vào một khung công tác hiện có, với nhiều phép toán & giấy hơn đằng sau nó).

Bây giờ, điểm cuối cùng trong một số trường hợp có thể nhạy cảm với hiệu suất, nhưng vẫn còn, mối quan tâm ban đầu sẽ không phải là hiệu suất. Mối quan tâm ban đầu sẽ là; nó sẽ hoạt động chứ? Điều này có thể được đánh giá trên các vấn đề đơn giản hơn hoặc với mã ít hiệu suất hơn chỉ đơn giản bằng cách đợi lâu hơn một chút, điều quan trọng hơn là có thể thực hiện nó trước tiên. Như đã đề cập trong các câu trả lời khác, nhờ các khung dựa trên C như Tensorflownumpy, những thứ này khá thường xuyên có thể được thực hiện ngay cả từ Python.


Cuối cùng, sự tồn tại của các thư viện và khung công tác mã nguồn mở nổi tiếng, dễ sử dụng, được thiết lập, đã đứng trước thử thách của thời gian là vô cùng quan trọng. Trong Python, chúng ta có:

  • Numpy
  • Gấu trúc
  • Matplotlib, Seaborn
  • học hỏi
  • Dòng chảy, Pytorch
  • XGBoost

Một lần nữa, nhiều trong số đó có các phần được triển khai trong C / C ++ khi hiệu năng cũng vậy.


Lưu ý rằng, khi tôi nói về nghiên cứu, điều này không chỉ có nghĩa là "học viện". AI trong công nghiệp cũng sẽ thường có một số hương vị của nghiên cứu. Những người trong ngành không có khả năng thực hiện Mạng nơ-ron từ đầu hết lần này đến lần khác. Nhiều khả năng họ đang sử dụng lại các triển khai đã hiệu quả (ví dụ như Tensorflow), nhưng đang cố gắng áp dụng chúng cho dữ liệu mới (nơi họ sẽ phải viết một số mã soạn sẵn mới xung quanh nó, rất nhanh chóng và dễ dàng trong Python) hoặc thử các kiến ​​trúc mới hoặc cố gắng trực quan hóa dữ liệu và / hoặc kết quả, v.v.


4
@DoumundDaseeco Có thể đó là trường hợp cụ thể đối với bạn, nhưng thường xuyên hơn không phải vậy. Sử dụng Tesla P100 từ Châu Âu / Châu Á trên đám mây google dường như ở mức $ 1,60 mỗi giờ ngay bây giờ. Nếu lựa chọn là giữa việc thuê nhiều GPU hơn hoặc thuê một nhà phát triển bổ sung vì tất cả các nhà phát triển của bạn chậm hơn do phải làm việc trong C ++ thay vì Python, các GPU bổ sung thường sẽ rẻ hơn. Dù sao, một phần của nhiều câu trả lời là thường không phải là một lựa chọn phù hợp; bộ phận thực hiện nhạy cảm một cách dễ dàng có thể (và thường được) thực hiện trong C ++ (ví dụ NumPy, tensorflow)
Dennis Soemers

@DoumundDaseeco Phải, và khi đưa vào python, nó cho phép các nhà phát triển tận hưởng tất cả các lợi ích của python mà không làm giảm hiệu suất (hoặc ít nhất là giảm hiệu suất giảm đáng kể).
Dennis Soemers

1

Lý do chính để Python được ưa thích là chi phí hoạt động. C ++ tự động đòi hỏi chi phí hoạt động lớn hơn về số lượng mã cần thiết để thực hiện bất kỳ điều cụ thể nào. Trí tuệ nhân tạo rất khó hiểu về mặt khái niệm, điều này khiến cho việc lập trình trở thành một vấn đề lớn hơn.

Với các mô-đun C ++ là một cách để mở rộng ngôn ngữ Python, có rất ít lý do để không sử dụng Python. Việc chuyển kiến ​​thức lập trình trong C ++ sang Python sẽ dễ dàng hơn thay vì tìm ra cách lập trình thư viện trong C ++ đủ rộng để phù hợp với khối kiến ​​thức hiện tại đã được tích hợp vào Python.


Các "mô-đun C / C ++" mà tôi đang đề cập là một phần của khả năng mở rộng của Python chứ không phải là ngôn ngữ C / C ++. Ở đâu và khi các tính năng đó xuất hiện trước Python, đó có thể là một chủ đề nhỏ liên quan đến câu hỏi ban đầu "Tại sao Python, không phải C?" liên quan đến học máy trong Python so với C ++ hơn là lịch sử của nó. Nếu bạn đang thêm vào "Có thể thực hiện được không?" lập luận, tôi sẽ thừa nhận rằng chắc chắn nó có thể. Lập luận của tôi là nhiều hơn một "Nó nên được thực hiện?" đối số, điều này chỉ ra thực tế rằng có thể cần nhiều nỗ lực lập trình hơn để làm điều tương tự trong C / C ++ với Python.
Blog công nghệ kỹ thuật của Nathan Eggers

1

Python là phổ biến cho tạo mẫu nhanh vì nhiều lý do.

  • Nó là một nền tảng có vỏ như Mathicala và MATLAB
  • Nó đã được xây dựng trong ma trận và các loại toán học khác
  • Nó là miễn phí, không giống như các nền tảng độc quyền
  • Các thư viện trong không gian ML hiện đang trưởng thành hơn SciLab

Cũng có thể là một yếu tố: Python hiện là ngôn ngữ giới thiệu được dạy rộng rãi nhất (xem, ví dụ: cacm.acm.org/bloss/blog-cacm/ trộm ). Vâng, đó có thể là lý do bạn chỉ ra ở đây, nó cũng giúp thúc đẩy việc tạo và bảo trì các thư viện ML.
John Doucette

@ JohnDoucette, tôi nghĩ thật tốt khi nó được dạy rộng rãi như một ngôn ngữ giới thiệu vì Pylint thi hành thụt đầu dòng. Tôi thậm chí không thể nhìn vào mã Java hoặc C ++ của người khác mà không chạy mã định dạng mã trên đó.
FauChristian

1

Bởi vì, trong khi C / C ++ chưa chết , chúng khó sử dụng và khó học. Tôi đã từng thích chúng, nhưng bây giờ, không ai có thể khiến tôi học được một điều với các tính năng như hành vi không xác định . Không đời nào! Quản lý bộ nhớ? Tại sao phải là tôi? Tôi chỉ không muốn lãng phí thời gian vào những thứ như vậy ... và tôi đoán, đó là thái độ chung của các sinh viên.

Sẽ luôn có những người yêu mến "cấp độ C tốt cũ" và đó là một điều tốt khi chúng ta cần hạt nhân và trình điều khiển, v.v. Nó có vị trí của nó.

C ++ ở cấp độ cao hơn, nhưng nó trở nên quá phức tạp đối với hầu hết chúng ta, những người thích dành thời gian học về thuật toán hơn là ngôn ngữ.

Tất cả mọi thứ có thể được thực hiện một cách hợp lý với ít nỗ lực hơn, không nên được thực hiện với nhiều nỗ lực hơn. Tôi đã sử dụng C ++ trong nhiều năm (một thời gian dài trước đây) và chỉ dành vài giờ với Python, nhưng tôi luôn chọn cái sau cho dự án vài nghìn dòng vì hiệu quả của mã hóa.

Hiệu quả thực hiện có thể được cải thiện sau này, thậm chí có thể bằng cách viết lại một phần nhỏ trong C ++. Thông thường, có thể đạt được nhiều hơn bằng cách thực hiện một thuật toán thông minh hơn.


Tôi không chắc chúng khó học. Chương trình UNIX đầu tiên của tôi là hello.c từ Kernighan & Ritchie. Sau đó, tôi quét phần còn lại của cuốn sách trong một giờ và viết một bộ chương trình phân tích vào cuối tuần đó. Tôi đã học C ++ bằng cách đọc Stroustrup cẩn thận hơn trong 3 ngày làm việc. Sau đó thật dễ dàng để viết một chương trình mô phỏng trước khi kết thúc ngày thứ tư. ~ ~ Có thể Python được trừu tượng hóa như MATLAB nhưng không yêu cầu thẻ tín dụng của tôi. ~ ~ Cộng với thung lũng silicon Người Python đi dạo quanh Trung tâm Moscone mỗi sự kiện với áo phông rad thực sự.
FauChristian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.