方法1为list遍历保存,方法2为stack后保存。效率與元素大小有關,元素大小爲1時方法1比2要慢7倍;元素大小爲7000時方法1比2要快0.7倍。當然效率也與list大小及array大小有關。
import torch as t
import time
def method1(source,target,num_repeat):
source_size=len(source)
target_size=target.shape[0]
target_tail_idx=0
for i in range(num_repeat):
for source_idx in range(source_size):
target[target_tail_idx]=source[source_idx]
target_tail_idx=(target_tail_idx+1)%target_size
return True
def method2(source,target,num_repeat):
source_size =len(source)
target_size = target.shape[0]
target_tail_idx = 0
for i in range(num_repeat):
source_tmp = t.stack(source)
target_tail_idx_next=target_tail_idx+source_size
if target_tail_idx_next>target_size:
source_half=target_size-target_tail_idx
target[target_tail_idx:]=source_tmp[:source_half]
target_tail_idx=target_tail_idx_next%target_size
target[:target_tail_idx]=source_tmp[source_half:]
else:
target[target_tail_idx:target_tail_idx_next]=source_tmp
target_tail_idx=target_tail_idx_next%target_size
return True
num_source=200
num_target=1000
ele_size=1000
num_repeat=1000
source=[t.rand(size=(ele_size,))for i in range(num_source)]
target=t.empty(size=(num_target,ele_size))
method1_start=time.time()
method1(source,target,num_repeat)
method1_time=time.time()-method1_start
print('method1 time {:.6f}'.format(method1_time))
method2_start=time.time()
method2(source,target,num_repeat)
method2_time=time.time()-method2_start
print('method2 time {:.6f}'.format(method2_time))
print('method 1/2 rate {:.6f}'.format(method1_time/method2_time))
默認source size爲300,array size爲100000
elesize(1) | elesize(10) | elesize(400) | elesize(7000) | |
method1 | 0.8050 | 0.7344 | 0.9340 | 3.8341 |
method2 | 0.1295 | 0.1612 | 0.3241 | 5.1561 |
time rate(1/2) | 6.2147 | 4.5547 | 2.8816 | 0.7436 |
可以在不同情況下選擇合適的方法。