Я сохранил массив значений (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) почему время всегда отличается, если я запускаю один и тот же код несколько раз?