Python: C и Fortran порядок того же массива NumPy;анализ времени - PullRequest
1 голос
/ 23 декабря 2019

Я сохранил массив значений (10000, 10000) в c-порядке и в fortran-порядке. Выполнены аналогичные операции над этими массивами, чтобы увидеть, какой из них быстрее / медленнее.

** Перед выполнением скрипта Python мой вывод таков: массив, хранящийся в c-порядке, должен быть быстрее, чем массив, хранящийся в порядке fortran (для того же цикла (сначала цикл по строкам, а затем цикл по столбцам)) **

Но я получил противоположный результат для одного случая (из многих положительных результатов);ниже

output of the code:

calculation for C style array
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

(10000, 10000)
time taken in sec: -403.6266212463379
same calculation for fortran style array
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

(10000, 10000)
time taken in sec: -368.0309956073761

Вот мой код Python:

# coding: utf-8
import numpy as np
import time 

nrow=10000
ncol=10000

print ('calculation for C style array')
#nrow=1000
#ncol=1000
arr = np.linspace(-1,1,nrow*ncol).reshape(nrow,ncol)
yf = np.array(arr, order='C')
print(yf.flags)
print(np.shape(yf))
start = time.time()
for row in range(nrow):
    for col in range(ncol):
        #print (yf[row, col])
        a=((yf[row, col]+yf[row,col]**10)/yf[row, col] * yf[row, col])
        b=a**2 + a**3  +a**10
        #with open('cstyle.dat','w') as f:
        #    f.write(str(b))
end = time.time()
print('time taken in sec: {}'.format(start-end))



print ('same calculation for fortran style array')
#nrow=1000
#ncol=1000
arr = np.linspace(-1,1,nrow*ncol).reshape(nrow,ncol)
yf = np.array(arr, order='F')
print(yf.flags)
print(np.shape(yf))
start = time.time()
for row in range(nrow):
    for col in range(ncol):
        #print (yf[row, col])
        a=((yf[row, col]+yf[row,col]**10)/yf[row, col] * yf[row, col])
        b=a**2 + a**3  +a**10
        #with open('fstyle.dat','w') as f:
        #    f.write(str(b))
end = time.time()
print('time taken in sec: {}'.format(start-end))
#print(start-end)


Итак: 1) почему противоположные результаты? 2) почему время всегда отличается, если я запускаю один и тот же код несколько раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...