list存入array的两种方法效率比较(测试)

方法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)
method10.80500.73440.93403.8341
method20.12950.16120.32415.1561
time rate(1/2)6.21474.55472.88160.7436

可以在不同情況下選擇合適的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值