【发布时间】:2020-08-20 18:00:52
【问题描述】:
我有一个来自 read_sql 的生成器,并使用 itertools.islice 将此生成器转换为迭代器。所以我使用 start 和 stop 参数将此生成器转换为切片中的迭代器。并且这个过程循环运行,将生成器转换为3个切片的迭代器,并将迭代器转换为列表。
第一次运行 -> iterable_slice = list(it.islice(generator_df, 0 , 3)) 需要 2.99 秒
第二次运行 -> iterable_slice = list(it.islice(generator_df, 4 , 6)) 需要 5.3 秒
并且随着每个新循环或下一组切片,列表转换需要更多时间。
为什么会发生这种情况,我在哪里犯了错误?请思想。谢谢。
#function to convert generator to slices
def gen_to_itr(generator_df,slice_start,slice_end):
iterable_slice = list(it.islice(generator_df, slice_start,slice_end))
#main function
slices = 3
slice_start = 0
slice_end = slices
flg_cnt = 0
while slice_end <= bcnt and flg_cnt <= 1:
generator_df = pd.read_sql(query2, test_connection_forbankcv_connection, chunksize = 1800)
first = time.perf_counter()
iterable_slice = gen_to_itr(generator_df,slice_start,slice_end)
end = time.perf_counter()
print(f'Chunk list created in {round(end-first, 2)} second(s)')
slice_start = slice_start+slices
.....
【问题讨论】:
-
您确定时间来自创建迭代器而不是执行查询吗?
-
肯定的,它每次运行的查询都是一样的。我相信这与执行查询无关。在查询生成器和结果相同之后也启动了计时器。
-
list(it.islice(generator_df, 4 , 6))在产生任何项目之前从generator_df获取并丢弃四个项目。它比list(it.islice(generator_df, 0 , 3))做更多的工作,在屈服之前不必跳过。 -
@StevenRumbalski 谢谢。这是有道理的。但是我把这个列表(it.islice(generator_df, 4 , 6)) 分成两行。首先是切片迭代器 it.islice(generator_df, 4 , 6) 和列表转换 list(iterable)。看起来第一步切片迭代器创建每个循环都需要相同的时间(秒),但它是 LIST CONVERSION 需要时间并且时间随着每个循环/新切片迭代器的增加而增加。想法?
标签: python iterator generator itertools chunking