Hướng dẫn dùng np maximum python

Tôi không nghĩ rằng việc vượt qua mảng hai lần là một vấn đề. Hãy xem xét mã giả sau đây:

minval = array[0]
maxval = array[0]
for i in array:
    if i < minval:
       minval = i
    if i > maxval:
       maxval = i

Mặc dù chỉ có 1 vòng lặp ở đây, nhưng vẫn có 2 kiểm tra. (Thay vì có 2 vòng lặp với 1 lần kiểm tra). Thực sự điều duy nhất bạn lưu là chi phí của 1 vòng lặp. Nếu các mảng thực sự lớn như bạn nói, thì chi phí đó nhỏ so với tải công việc của vòng lặp thực tế. (Lưu ý rằng tất cả điều này được thực hiện trong C, vì vậy các vòng lặp ít nhiều miễn phí).


EDIT Xin lỗi 4 bạn đã ủng hộ và có niềm tin vào tôi. Bạn chắc chắn có thể tối ưu hóa điều này.

Đây là một số mã fortran có thể được biên dịch thành mô-đun python thông qua f2py(có thể một Cythonguru có thể đi cùng và so sánh mã này với phiên bản C được tối ưu hóa ...):

subroutine minmax1(a,n,amin,amax)
  implicit none
  !f2py intent(hidden) :: n
  !f2py intent(out) :: amin,amax
  !f2py intent(in) :: a
  integer n
  real a(n),amin,amax
  integer i

  amin = a(1)
  amax = a(1)
  do i=2, n
     if(a(i) > amax)then
        amax = a(i)
     elseif(a(i) < amin) then
        amin = a(i)
     endif
  enddo
end subroutine minmax1

subroutine minmax2(a,n,amin,amax)
  implicit none
  !f2py intent(hidden) :: n
  !f2py intent(out) :: amin,amax
  !f2py intent(in) :: a
  integer n
  real a(n),amin,amax
  amin = minval(a)
  amax = maxval(a)
end subroutine minmax2

Biên dịch nó qua:

f2py -m untitled -c fortran_code.f90

Và bây giờ chúng ta đang ở một nơi mà chúng ta có thể kiểm tra nó:

import timeit

size = 100000
repeat = 10000

print timeit.timeit(
    'np.min(a); np.max(a)',
    setup='import numpy as np; a = np.arange(%d, dtype=np.float32)' % size,
    number=repeat), " # numpy min/max"

print timeit.timeit(
    'untitled.minmax1(a)',
    setup='import numpy as np; import untitled; a = np.arange(%d, dtype=np.float32)' % size,
    number=repeat), '# minmax1'

print timeit.timeit(
    'untitled.minmax2(a)',
    setup='import numpy as np; import untitled; a = np.arange(%d, dtype=np.float32)' % size,
    number=repeat), '# minmax2'

Kết quả hơi đáng kinh ngạc đối với tôi:

8.61869883537 # numpy min/max
1.60417699814 # minmax1
2.30169081688 # minmax2

Tôi phải nói rằng, tôi không hoàn toàn hiểu nó. So sánh chỉ là np.minso với minmax1minmax2vẫn là một trận thua, vì vậy đó không chỉ là vấn đề về trí nhớ ...

lưu ý - Việc tăng kích thước theo hệ số 10**avà giảm lặp lại theo hệ số 10**a(giữ kích thước sự cố không đổi) sẽ thay đổi hiệu suất, nhưng không phải theo cách có vẻ nhất quán cho thấy có một số tương tác giữa hiệu suất bộ nhớ và chức năng gọi hàm trong trăn. Thậm chí so sánh minviệc thực hiện đơn giản trong fortran đánh bại numpy với hệ số xấp xỉ 2 ...

25 hữu ích 5 bình luận chia sẻ