Fortran vs python vs matlab

Chúng tôi viết mã để kiểm tra hiệu suất của một số ngôn ngữ máy tính [Python, Julia, Matlab, IDL, R, Java, Scala, Fortran và C]. Các mã giải quyết các tác vụ đơn giản để kiểm tra cách các ngôn ngữ khác nhau xử lý các vòng lặp, vector hóa, đa xử lý, thao tác mảng, đọc các tập hợp tệp, v.v. Mục tiêu không phải là xác định ngôn ngữ nào tốt hơn ngôn ngữ kia mà thay vào đó là làm nổi bật điểm mạnh và điểm yếu của từng ngôn ngữ. Chúng tôi cũng muốn nhấn mạnh tầm quan trọng của việc có các ngôn ngữ có thể tương tác với nhau để giải quyết các ứng dụng phức tạp. Các kết quả [được cập nhật ít nhất mỗi năm một lần] từ nghiên cứu này được trình bày [bao gồm cả mã nguồn] thông qua một trang web của NASA mà các học viên cần thông tin đó có thể truy cập được để xác định ngôn ngữ nào phù hợp để hoàn thành một nhiệm vụ cụ thể

Tải ngay

Chi tiết phần mềm

Loại

Công cụ thiết kế và tích hợp

Số tham chiếu

GSC-18111-1

Loại phát hành

Mã nguồn mở

Hệ điều hành

Linux, hệ điều hành X

Liên hệ với chúng tôi về công nghệ này

Trung tâm bay không gian Goddard

gsfc-softwarerequest@mail. nasa. chính phủ

Chỉnh sửa ngày 6 tháng 2 năm 2018. Một số lưu ý. Trong Python

import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
2 nhanh hơn
import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
3 nhanh hơn
import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0. Tuy nhiên, trong MATLAB trên máy của tôi,
import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0 nhanh hơn một chút so với
import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
3. Mã Fortran tôi chạy có thể được cải thiện một chút [ python numpy_bench.py > python numba_bench_single.py > python numba_bench_par.py

Thư mục MATLAB và thực thi

import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0

Thư mục Fortran và thực thi

import numpy as np
import numba
import time as time

@numba.vectorize[["float64[float64,float64]"],
    nopython=True,target='cpu']
def add2_par[x, y]:
    return x + 2 * y
n = np.array[ int[1e9]]# number of data points

X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
1

Kết quả

Trên cả hai máy của tôi, một lần chạy Numba luồng đơn trung bình nhanh hơn mã Fortran đã biên dịch [không có mức tối ưu hóa -O2]. Với mức tối ưu hóa -O2, có vẻ như Fortran nhanh hơn luồng đơn lẻ, nhưng với biên độ rất hẹp. Bên dưới, bạn sẽ thấy thời gian chạy trung bình tính bằng giây giữa gfortran -O2 và Python Numba luồng đơn

Phần tử mảng CPUgfortran -O2 [s]Python Numba [s]AMD FX-83701,000,0000. 002250. 00202AMD FX-837010,000,0000. 019520. 01946AMD FX-8370100,000,0000. 192580. 18895AMD FX-83701,000,000,0001. 907811. 91261i5-6300u1,000,0000. 001280. 00098i5-6300u10,000,0000. 009960. 01041i5-6300u100,000,0000. 100230. 10142i5-6300u1,000,000,0000. 949561. 03110

Tôi không mong đợi điều này – và tôi không chắc thứ ma thuật đen gọi là Numba này hoạt động như thế nào… Tôi cần nghiên cứu thêm về những gì Numba thực sự đang làm với phần tổng hợp JIT. Xếp hạng tốc độ từ Chậm nhất đến Nhanh nhất trên AMD-FX870. MATLAB, NumPy, gfortran, Numba luồng đơn, gfortran -O2, Numba song song. Với i5-6300U, thời gian MATLAB và NumPy ít khác biệt hơn [về cơ bản chúng giống nhau]

Tôi cũng rất ngạc nhiên khi thấy với i5-6300u, NumPy và Fortran chạy với tốc độ gần như nhau. Đối với mảng 1.000.000.000 phần tử, mã Fortran [không có cờ O2] chỉ là 3. Nhanh hơn 7% so với mã NumPy

Mã Numba song song thực sự tỏa sáng với 8 lõi của AMD-FX870, nhanh hơn khoảng 4 lần so với MATLAB và nhanh hơn 3 lần so với Numpy. Tuy nhiên, mã Numba song song chỉ nhanh hơn khoảng hai lần so với Numpy với i5-6300u, nhưng điều này hợp lý vì đây chỉ là bộ xử lý hai lõi [4 luồng]

Các số liệu bên dưới hiển thị kết quả điểm chuẩn của thời gian chạy trung bình trên thang đo log-log. Một con số khác cho thấy việc triển khai chậm hơn bao nhiêu so với mức trung bình chạy song song của Numba

Thảo luận về việc sử dụng bộ nhớ

Bạn không thể thực hiện điểm chuẩn này mà không đề cập rằng ví dụ Python này là Bộ nhớ HOG khi so sánh với Fortran và MATLAB. Python sẽ đạt mức cao nhất là 24 GB RAM để thực hiện phép toán với 1.000.000.000 mảng phần tử, bất kể bạn sử dụng Numba hay NumPy thuần túy. Điều này cực kỳ kém hiệu quả – vì Python chỉ lưu trữ 16 GB dữ liệu trong RAM sau và trước khi hoạt động. MATLAB và Fortran giải quyết vấn đề này với mức sử dụng bộ nhớ cao nhất là 16 GB RAM. Cần thêm 33% RAM để thực hiện thao tác mảng với Python so với MATLAB hoặc Fortran. [Mức sử dụng RAM cao nhất được ước tính bằng thời gian GNU /usr/bin/time -v]

Phần kết luận

Wow Numba thật nhanh. Tôi chưa bao giờ mong đợi được thấy sự kết hợp mảng Python NumPy Numba nhanh như mã Fortran được biên dịch. Chi phí rõ ràng là cần có thời gian để chuyển mã Python NumPy hiện có của bạn sang Numba. Khả năng tăng tốc song song của Numba hoạt động rất tốt trong vấn đề này và với 8 nhân AMD-FX870 song song Numba chạy nhanh hơn 4 lần so với mã MATLAB

Có bất cứ điều gì tôi bỏ lỡ? . Bạn có thể xem mã tôi đã sử dụng để chạy điểm chuẩn tại đây

Điều đáng lưu ý là tôi đã không thực hiện điểm chuẩn này với ATLAS và việc sử dụng ATLAS có thể tăng tốc nghiêm trọng quá trình thực thi Fortran của vấn đề này [và cũng có khả năng tăng tốc quá trình thực thi Numpy và Numba]

MATLAB có tốt hơn Fortran không?

MATLAB được xây dựng để tính toán ma trận, và trong khi có, nó chậm hơn mã biên dịch C++/Fortran , nhưng có một cách hiệu quả để tạo . Đây là một dòng mã duy nhất, có thể thao tác dữ liệu theo nhiều cách trong các mảng/ma trận khổng lồ.

Python có tốt hơn Fortran không?

Vì vậy, có, Python đơn giản chậm hơn nhiều so với Fortran . Tuy nhiên, so sánh này không có ý nghĩa gì, vì việc sử dụng Python trong khoa học không dựa vào Python thuần túy. Thay vào đó, Python được sử dụng như một lớp dán, dựa vào các gói được tối ưu hóa đã biên dịch mà nó kết hợp với nhau để thực hiện tính toán mục tiêu.

Fortran có khó hơn Python không?

Tính song song thực sự có thể mang lại lợi thế cho nhóm nghiên cứu và ngày càng trở nên phổ biến. Tôi cũng cho rằng về nhiều thứ Fortran dễ học hơn C và thậm chí cả Python . Mô hình lập trình mà Fortran sử dụng dễ học hơn nhiều so với mô hình hướng đối tượng mà Python được xây dựng xung quanh.

Python hay Fortran cái nào dễ hơn?

Dễ học . Có lẽ tìm tài liệu học Python tốt dễ hơn tài liệu học Fortran tốt vì Python được sử dụng rộng rãi hơn và Fortran hiện được coi là ngôn ngữ "đặc sản" cho điện toán số. Python and Fortran are both relatively easy-to-learn languages. It's probably easier to find good Python learning materials than good Fortran learning materials because Python is used more widely, and Fortran is currently considered a "specialty" language for numerical computing.

Chủ Đề