Hướng dẫn is r slower than python - r chậm hơn python
Show Làm thế nào dễ dàng để viết mã hiệu quả?Ảnh của Áo Augusts trên unplashTL; DR: Chỉ cần nhảy vào phần so sánh tổng thể Nếu bạn là một nhà khoa học dữ liệu, rất có thể bạn lập trình trong Python hoặc R. nhưng có một đứa trẻ mới trong khối có tên Julia hứa hẹn hiệu suất giống như C mà không ảnh hưởng đến cách các nhà khoa học dữ liệu viết mã và tương tác với dữ liệu. Trong bài đăng cuối cùng của tôi, tôi đã so sánh R với Julia, cho thấy Julia mang đến một tư duy lập trình làm mới cho cộng đồng khoa học dữ liệu. Điều quan trọng chính là với Julia, bạn không còn cần phải vector hóa để cải thiện hiệu suất. Trong thực tế, việc sử dụng tốt các vòng lặp có thể mang lại hiệu suất tốt nhất.my last post, I have compared R to Julia, showing how Julia brings a refreshening programming mindset to the Data Science community. The main takeaway is that with Julia, you no longer need to vectorize to improve performance. In fact, good use of loops might deliver the best performance. Trong bài đăng này, tôi đang thêm Python vào hỗn hợp. Ngôn ngữ lựa chọn của các nhà khoa học dữ liệu có một lời để nói. Chúng tôi sẽ giải quyết một vấn đề rất đơn giản trong đó các triển khai tích hợp có sẵn và khi lập trình thuật toán từ đầu là đơn giản. Mục tiêu là để hiểu các lựa chọn của chúng tôi khi chúng tôi cần viết mã hiệu quả. Kiểm tra thành viên thông qua tìm kiếm tuyến tínhChúng ta hãy xem xét vấn đề thử nghiệm thành viên trên một vectơ số nguyên chưa được phân loại. julia> 10 ∈ [71,38,10,65,38] Về nguyên tắc, vấn đề này được giải quyết thông qua tìm kiếm tuyến tính. Thuật toán chạy qua các phần tử của vectơ đầu vào cho đến khi tìm giá trị được tìm kiếm (tìm kiếm thành công) hoặc đạt đến cuối vectơ (tìm kiếm không thành công). Mục tiêu là cho biết nếu một số nguyên nhất định là trong vector.in the vector. Để đánh giá các triển khai khác nhau trong R, Python và Julia, tôi đã tạo một bộ dữ liệu với 1.000.000 số nguyên duy nhất từ 1 đến 2.000.000 và thực hiện 1.000 tìm kiếm với tất cả các số nguyên từ 1 đến 1.000. Xác suất tìm kiếm thành công là ~ 50%, do đó, một nửa số thuật toán sẽ quét vectơ hoàn chỉnh để kết luận rằng tìm kiếm không thành công. Trong các trường hợp còn lại, thuật toán phải yêu cầu (N+1)/2 đánh giá (trung bình) để tìm phần tử, với n là độ dài của vectơ. Tôi đã đo hiệu suất của mỗi lần thực hiện bằng cách dành thời gian CPU trung bình là 3 lần chạy. Thông tin bổ sung về phần cứng và phần mềm để chạy thử nghiệm có thể được tìm thấy ở đây. Xin lưu ý rằng mục tiêu của các thí nghiệm này là không tạo ra một điểm chuẩn chính xác của các ngôn ngữ và triển khai khác nhau. Mục tiêu là làm nổi bật các rào cản mà ngôn ngữ gây ra cho các nhà khoa học dữ liệu khi hiệu suất là quan trọng. C thực hiệnTôi đã triển khai tìm kiếm tuyến tính trong C để hiểu rõ về hiệu suất trên ngôn ngữ được gõ tĩnh và đặt đường cơ sở. Việc thực thi nhị phân mất 0,26 giây thời gian CPU để thực hiện 1.000 tìm kiếm. R thực hiệnTôi đã thử các hương vị khác nhau của thử nghiệm thành viên trong R, từ một nhà điều hành chuyên dụng ( Khi chúng tôi chuyển từ Tôi cũng đã thử các hoạt động giảm MAP, nhưng không có đủ kiên nhẫn để đợi cho đến khi họ hoàn thành không phải là một tùy chọn nếu bạn tìm kiếm hiệu suất. Thực hiện PythonThành thật mà nói, mục tiêu ban đầu là chỉ sử dụng các hàm gốc và cấu trúc dữ liệu gốc, nhưng toán tử Julia thực hiệnỞ Julia, tôi đã bao gồm một vài hương vị hơn để thể hiện sự đa dạng và hiệu suất của các chức năng tự nhiên. Ngoại trừ các hoạt động vector hóa, hiệu suất khá gần với việc thực hiện trong C, với sự xuống cấp từ 20%-50%. Hiệu suất vectorized là khá, khoảng 4 lần thời gian CPU CPU, nhưng cũng có khoảng 2 lần thời gian CPU 2X Numpy trên các hoạt động vectơ. Sự tự do mà bạn nhận được là không thể tin được, vì bạn có thể mã hóa hầu như bất kỳ thuật toán nào trong Julia! Để đạt được hiệu suất hàng đầu trên các vòng lặp, tôi đã sử dụng các gợi ý để nói với trình biên dịch không kiểm tra xem các chỉ mục có nằm trong giới hạn của mảng không (macro ____10) và để nói với trình biên dịch nó có thêm tự do theo thứ tự nó thực thi các lần lặp ( map(line -> parse(Int, line), eachline(f)) 1 macro). Trong trường hợp bạn đang tự hỏi, không cung cấp những gợi ý này sẽ mang lại hiệu suất của các vòng lặp gần với in_search .So sánh tổng thể.Tìm kiếm kết quả cạnh nhau cho vấn đề đơn giản này, chúng tôi quan sát rằng:
Chi tiết vấn đề…Tôi có thể dừng bài viết ngay tại đây và viết sự liền mạch như thế nào khi viết mã hiệu quả trong Julia. Tuy nhiên, chi tiết quan trọng, và lập trình viên cần phải chú ý đến nội bộ của Julia. Bạn có thể đoán được dòng mã ảnh hưởng đến hiệu suất nhất là gì không? Đây là một gợi ý: bạn sẽ không tìm thấy nó trong bất kỳ đoạn trích nào được trình bày trước khi Đây là: map(line -> parse(Int, line), eachline(f)) Dòng mã này phân tích tệp văn bản đầu vào F, chứa một số trên mỗi dòng (lưu ý rằng đọc tệp không phải là một phần của điểm chuẩn). Vì vậy, điều gì đặc biệt về dòng mã này? Tóm lại, Julia Infers rằng:
Vì Julia biết rằng đang lưu trữ một loạt các số nguyên, nên nó phân bổ một khối bộ nhớ liên tục trong đó mỗi mục chứa một số nguyên. Điều này cho phép các hoạt động đọc hiệu quả. Làm thế nào chúng ta có thể gây rối? Đây là một cách: a = [] Có vẻ tương tự, phải không? Tuy nhiên: > typeof(a) Câu map(line -> parse(Int, line), eachline(f)) 4, thuận tiện như vẻ ngoài của nó, tạo ra một mảng map(line -> parse(Int, line), eachline(f)) 5, có nghĩa là bạn có thể lưu trữ bất kỳ loại dữ liệu nào trên mỗi phần tử của mảng. Trong nội bộ, Julia lưu trữ một loạt các con trỏ trong bộ nhớ để gắn kết với tính linh hoạt mà map(line -> parse(Int, line), eachline(f)) 5 cung cấp. Do đó, Julia không còn có thể xử lý một khối bộ nhớ liên tục tuần tự khi xử lý mảng. Tác động đến hiệu suất là gì? Chậm hơn khoảng 50 đến 100 lần!bout 50 to 100 times slower!Khắc phục mã này sẽ khá đơn giản: map(line -> parse(Int, line), eachline(f)) 7 (thay vì map(line -> parse(Int, line), eachline(f)) 4) sẽ thực hiện công việc vì nó chỉ định loại yếu tố.Điểm mấu chốtTừ tất cả các ngôn ngữ được đề cập trong bài viết này, Julia rõ ràng là dễ dàng nhất để viết mã hiệu quả. Tuy nhiên, bạn cần biết những gì bạn đang làm. May mắn thay, các mẹo hiệu suất có sẵn có thể đưa bạn đi đúng hướng. Mã hóa hạnh phúc! P.S. Tôi sử dụng cả ba ngôn ngữ thường xuyên và tôi yêu tất cả chúng. Mỗi người có vị trí của nó. Tại sao R rất chậm?Có rất nhiều chi phí trong quá trình xử lý vì R cần kiểm tra loại biến gần như mỗi khi nó nhìn vào nó.Điều này giúp bạn dễ dàng thay đổi các loại và tái sử dụng tên biến, nhưng làm chậm tính toán cho các tác vụ rất lặp đi lặp lại, như thực hiện một hành động trong một vòng lặp.R needs to check the type of a variable nearly every time it looks at it. This makes it easy to change types and reuse variable names, but slows down computation for very repetitive tasks, like performing an action in a loop.
Ngôn ngữ R có chậm không?Mặc dù R chậm so với các ngôn ngữ lập trình khác, đối với hầu hết các mục đích, nhưng nó đủ nhanh.R is slow compared to other programming languages, for most purposes, it's fast enough.
R tốt hơn Python ở bất cứ điều gì?Vì nhiều người sử dụng R để phân tích thống kê và số, nó cung cấp hỗ trợ và thư viện tốt hơn Python.it provides better support and libraries than Python.
Tại sao R khó hơn Python?Học đường cong Nếu bạn có nền tảng về số liệu thống kê, mặt khác, R có thể dễ dàng hơn một chút.Nhìn chung, cú pháp dễ đọc của Python mang đến cho nó một đường cong học tập mượt mà hơn.R có xu hướng có một đường cong học tập dốc hơn ngay từ đầu, nhưng một khi bạn hiểu cách sử dụng các tính năng của nó, nó sẽ dễ dàng hơn đáng kể.R tends to have a steeper learning curve at the beginning, but once you understand how to use its features, it gets significantly easier. |