第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

tuple() 增加這么多運(yùn)行時間是正常的嗎?

tuple() 增加這么多運(yùn)行時間是正常的嗎?

慕村225694 2022-11-01 16:52:45
我有一個相對較長(20,000 行)的 CSV 文件和一個簡單的函數(shù)來打開它:def read_prices():    with open('sp500.csv', 'r') as f:        reader = csv.DictReader(f)        for row in reader:            yield float(row['Adj Close'].strip())當(dāng)我按原樣計(jì)時時3e-05s:print(timeit.timeit(lambda: read_prices(), number=100))當(dāng)我計(jì)時相同的功能但tuple(...)它需要一個驚人的27s:print(timeit.timeit(lambda: tuple(read_prices()), number=100))這是正常的tuple()嗎?為什么會這樣?我是初學(xué)者,所以歡迎 ELI5 解釋:)
查看完整描述

2 回答

?
慕斯709654

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個贊

發(fā)生這種情況是因?yàn)?code>read_prices它不是一個函數(shù) - 它實(shí)際上是一個generator. 那是因?yàn)?code>yield關(guān)鍵字。

正如函數(shù)式編程 HOWTO中所解釋的:

任何包含yield關(guān)鍵字的函數(shù)都是生成器函數(shù);這是由 Python 的字節(jié)碼編譯器檢測到的,該編譯器專門編譯該函數(shù)作為結(jié)果。

當(dāng)您調(diào)用生成器函數(shù)時,它不會返回單個值;相反,它返回一個支持迭代器協(xié)議的生成器對象。

所以當(dāng)你第一次運(yùn)行時發(fā)生的read_prices()只是一個generator對象的創(chuàng)建,等待被告知yield元素。

在第二個版本中tuple(read_prices()),您像以前一樣創(chuàng)建generator對象,但tuple()實(shí)際上會一次性耗盡它和yield所有元素


一個簡單的演示:

>>> def yielder():

...     yield from [1, 2, 3]

...     

>>> y = yielder()

>>> y

<generator object yielder at 0x2b5604090de0>

>>> next(y)

1

>>> list(y)

[2, 3]

>>> tuple(yielder())

(1, 2, 3)


查看完整回答
反對 回復(fù) 2022-11-01
?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊

這是因?yàn)檫@是一個生成器 read_prices('SP500.csv'),當(dāng)這樣調(diào)用時它幾乎什么都不做。

但是,當(dāng)您這樣做時,tuple(read_prices('SP500.csv'))它會操作生成器并提供值。

生成器是可迭代的,由 a 操作:

  • for 循環(huán)

  • 下一個

  • 使用解包tuple(如您所述)或list

在涉及集合構(gòu)造的其他操作中。

這是一個更具體的生成器示例:

def f():

    print("First value:")

    yield "first"

    print("Second value:")

    yield "second"

這是在行動:


### Nothing prints when called (analogous to your first timeit  without tuple)


In [2]: v = f()


In [3]:


### However when I call `next` the first value is provided:


In [3]: next(v)

First value:

Out[3]: 'first'


## etc, until there is no more values and a "StopIteration` exception is raised:


In [4]: next(v)

Second value:

Out[4]: 'second'


In [5]: next(v)

------------------------------------

...


StopIteration:


## by unpacking using "tuple" the "StopIteration" 

## exception is handled and all the values are provided at once

##  (like your timeit using the tuple):


In [6]: tuple(f())

First value:

Second value:

Out[6]: ('first', 'second')


查看完整回答
反對 回復(fù) 2022-11-01
  • 2 回答
  • 0 關(guān)注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號