我正在瀏覽delta Lake 檔案頁面。有這樣一行:
from delta import *
builder = pyspark.sql.SparkSession.builder.appName("MyApp") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
spark = spark = configure_spark_with_delta_pip(builder).getOrCreate()
在最后一行,我們看到了相同變數(spark)的雙重賦值。與以下相比,這是否有所不同:
spark = spark = configure_spark_with_delta_pip(builder).getOrCreate()
(vs)
spark = configure_spark_with_delta_pip(builder).getOrCreate()
一般來說,在 python 中,對同一變數進行雙重賦值是否有意義?
uj5u.com熱心網友回復:
簡短的回答:沒有意義。除了重復執行相同操作的幾個浪費周期之外,最終結果是相同的。
長答案:在某些情況下它可能會產生影響,但它們都不適用于正在正常執行的代碼(不是通過eval/ exec)分配給裸名(而不是分配給點名,其中描述符協議和其他屬性訪問自定義的形式可能會做一些奇怪的事情,或者分配給下標運算式的結果,例如索引/鍵查找或切片,其中的覆寫__setitem__可能會呼叫任意代碼)。
在這種情況下,在 CPython 參考解釋器上,它所做的只是添加一些額外的指令,一個用于復制堆疊頂部的值(因此它可以將其分配給兩個目標而無需重新計算),以及一個分配給spark第二次(這只會導致分配給它的舊值被丟棄)。
這兩條指令的最終效果是一些不必要的參考計數操作(當它使堆疊頂部加倍時會增加一個額外的 incref,而當它丟棄spark第一次系結的參考以支持第二次系結時的額外 decref ),以及一個額外的 C 陣列查找(對于STORE_FAST/ STORE_DEREF,分別在函式中執行到函式區域變數或閉包變數時,后者添加一對廉價的指標取消參考以查找/更新閉包變數的位置)或一個額外的dict查找(用于所有其他裸名分配的STORE_NAME/案例)。STORE_GLOBAL成本是微不足道的(最多低兩位數納秒),所以它是無害的,只是不必要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486898.html
