我正在尝试加快以下代码的速度,在给定字符串列表的情况下,str_list
我试图将字符串转换为数字 ( unpack
) 并将此数字分配到嵌套列表的正确位置data
。的尺寸data
大致为data[4][20][1024]
. 不幸的是,这个函数运行得很慢。这是代码:
for abs_idx in range(nbr_elements):
# get string
this_element = str_list[abs_idx]
# convert into number
this_element = unpack('d', this_element)[0]
# calculate the buffer number
buffer_nbr = abs_idx / NBR_DATA_POINTS_PER_BUFFER_INT
# calculate the position inside the buffer
index_in_buffer = abs_idx % NBR_DATA_POINTS_PER_BUFFER_INT
# write data into correct position
data[file_idx][buffer_nbr][index_in_buffer] = this_element
我还尝试了以下替代解决方案,它甚至更慢:
# convert each string into a number
unpacked_values = [unpack('d', str_list[j])[0] for j in range(nbr_elements)]
for abs_idx in range(nbr_elements):
# calculate the buffer number
buffer_nbr = abs_idx / NBR_DATA_POINTS_PER_BUFFER_INT
# calculate the position inside the buffer
index_in_buffer = abs_idx % NBR_DATA_POINTS_PER_BUFFER_INT
# write data into correct position
data[file_idx][buffer_nbr][index_in_buffer] = unpacked_values[abs_idx]
令我惊讶的是,下一个实现是最慢的(我预计它是最快的):
# convert each string into a number
unpacked_values = [unpack('d', str_list[j])[0] for j in range(nbr_elements)]
# calculate all buffer numbers at once
buffer_ids = np.arange(nbr_elements) / NBR_DATA_POINTS_PER_BUFFER_INT
# calculate all positions inside the buffer at once
index_in_buffer_id = np.arange(nbr_elements) % NBR_DATA_POINTS_PER_BUFFER_INT
for abs_idx in range(nbr_elements):
data[file_idx][buffer_ids[abs_idx]][index_in_buffer_id[abs_idx]] = unpacked_values[abs_idx]
为什么连续的实现表现更差?个人瓶颈在哪里?我怎样才能加快我的初始代码?
编辑:从我的分析测试中,以下两个步骤是瓶颈:运行unpack
并将值分配给data
. 我不知道如何加快这些步骤。
EDIT2:我需要使用unpack
,因为我的字符串是十六进制的。
EDIT3: values = unpack("d" * n, "".join(str_list))
解决了解包速度慢的问题。尽管如此,使用三重(原始)或双重(修改)嵌套循环对数据的分配占用了 50% 的时间。有没有办法减少这个时间?