【问题标题】:Python - List conversion of sliced iterable increases with every slicePython - 切片迭代的列表转换随着每个切片而增加
【发布时间】: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


【解决方案1】:

it.islice() 在创建新迭代器时必须跳过生成器的第一个 slice_start 元素。这需要的时间与slice_start 成正比。

但是,我很难相信跳过熊猫系列的每个元素需要大约 1 秒。如果块大小小于切片大小,则可能需要从数据库中再次获取以获取下一个块。但只要你在同一个块中,我认为它应该具有与遍历静态系列相同的速度。

【讨论】:

  • 谢谢。这是有道理的。但是我把这个列表(it.islice(generator_df, 4 , 6)) 分成两行。首先是切片迭代器 it.islice(generator_df, 4 , 6) 和列表转换 list(iterable)。看起来第一步切片迭代器创建每个循环都需要相同的时间(秒),但它是 LIST CONVERSION 需要时间并且时间随着每个循环/新切片迭代器的增加而增加。想法?
  • islice() 可能会推迟跳过元素,直到第一次调用它来生成元素。
  • Python是开源的,为什么不看看islice的实现呢?
猜你喜欢
  • 2010-11-23
  • 2015-02-04
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多