xrangepython
Ⅰ python 的range()函數怎麼使用,為什麼單獨運行print(range(1,5))輸出還是range(1,5),而不是[1,2,3,4]
print("類型:",type(range(1,5)))
print(range.mro())
看結果:
Ⅱ Python學習之惰性求值
惰性求值,也就是延遲求值,表達式不會在它被綁定到變數之後就立即求值,而是等用到時再求值。這個特性可以解決一些巨大甚至無限的集合列表,如菲波那切數列、幾十G的文件等等。延遲求值的一個好處是能夠建立可計算的無限列表而沒有妨礙計算的無限循環或大小問題。
Python中的很多方法沒有直接返回列表,而是返回了一個可迭代的generator
(生成器)對象,這便是python的惰性求值,因為在創建一個很大的列表時,對內存的開銷非常大,太大時python會直接報錯,舉個:chestnut::range()方法是產生一個指定范圍列表,在Python3之前,該方法直接產生一個列表,xrange()產生一個生成器:
>>>xrange(100)
xrange(100)
>>>range(100)
[0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
當參數裡面的值足夠大時,range()產生了一個巨大的列表,這是內存會吃不消,等待一段時間後程序會直接被Kill掉:
>>>foriinrange(999999999999):
...
printi
...
Killed:
9
占滿內存
用xrange()方法就不回出現這種問題,並且可以一直運行:
>>>foriinxrange(999999999999):
...
printi
...
0
1
2
3
4
5
6
7
8
9
10...
在Python3中range已經被改為了xrange,所以在python3中可以放心使用range().
惰性求值不要求你事先准備好整個迭代過程中所有的元素。迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之後,元素可以不存在或者被銷毀
還有前文所說的list comprehension語句,在兩邊放上[],會產生別表,如果數據源很長則會報內存錯誤:
>>>
print [iforiinrange(9999999999999999)]
Python(1627,0x7fffe5b713c0)
malloc: *** mach_vm_map(size=80000000000000000) failed
(errorcode=3)
***error:
can't allocate region
***seta
breakpointinmalloc_error_breaktodebug
Traceback
(most recentcalllast):
File "",
line 1,in<</span>mole>
MemoryError
這樣直接產生列表沒有效率,為了創建生成器對象,可以在list
comprehension兩邊放上(),這樣它就有了惰性求值的特性。
>>>
print((ifori
inrange(99999999999999)))
使用next()內建函數訪問生成器里的元素:
num =
(iforiinrange(5))
>>>
num
>>>>
next(num)
0
>>>
next(num)
1
>>>
for j in range(4):
...
print(next(num))
...
2
3
4
Traceback
(most recent call last):
File "",
line 2,in<</span>mole>
StopIteration
當訪問到最後元素時,再調用next(),Python將會拋出StopIteration異常。Python正是根據是否檢查到這個異常來決定是否停止迭代。
step1 =
someLongOperation1()step2 = someLongOperation2()step3 =
concatenate(step1, step2)
以上代碼需要分別執行一二兩步操作,第三步用到一二兩步的結果,在Pyhton中會有序的執行這些函數:首先是someLongOperation1,然後someLongOperation2,最後concatenate,如果確保沒有函數修改或依賴於全局變數,第一二步可以被並行執行。假設我們不想並行運行這兩個函數,我們只在其他函數依賴於step1和step2時才需要執行這兩個函數。我們甚至在concatenate調用之前都不必執行他們,可以把他們的求值延遲到concatenate函數內實際用到他們的位置。如果函數中用到了if分支語句,條件無關step1和step2則可以盡量將判斷條件放前面以減少不必要的計算:
step1 =
someLongOperation1()
step2 =
someLongOperation2()ifcondition:
step3 =
concatenate(step1, step2)
換為:ifcondition:
step1 =
someLongOperation1()
step2 =
someLongOperation2()
step3 =
concatenate(step1, step2)
如果concatenate是一個帶有條件分支的函數並且有的分支中只用了兩個參數中的一個,另一個參數就永遠沒有必要被求值。
Ⅲ python中xrange和range的區別用法
在python中
range
函數說明:range([start,] stop[, step]),根據start與stop指定的范圍以及step設定的步長,生成一個列表。
例子:總結:
所以xrange做循環的性能比range好,尤其是返回很大的時候。盡量用xrange吧,除非你是要返回一個列表。
Ⅳ python中,randrange,range,xrange以及choice的區別
1.randrange()
返回一個數,必須導入random模塊
2.range
返回的是一個列表
3.xrange()
返回一個生成器,必須藉助list函數,才能看到結果
xrange與range的主要區別:
當生成很大的數字序列的時候,用xrange會比range性能優很多,因為不需要一上來就開辟一塊很大的內存空間。
4.choice'
choice() 方法返回一個列表,元組或 字元串的隨機項 。
Ⅳ Python中Range和XRange的區別
在大多數情況下,xrange和range在功能方面完全相同。它們都提供了一種生成整數列表的方法,唯一的區別是range返回一個Python列表對象,x range返回一個xrange對象。這就表示xrange實際上在運行時並不是生成靜態列表。它使用稱為yielding的特殊技術根據需要創建值。該技術與一種稱為生成器的對象一起使用。因此如果你有一個非常巨大的列表,那麼就要考慮xrange。
Ⅵ python為什麼沒有一個高效的for循環,還是我無知
本回答適用於python3.x
python本身速度確實相對比較慢。 但是相對來說,python有比直接的for循環快速的寫法。
比如標准for循環寫法如下
for i in range(10000):
i**2
這樣就比較慢,標准寫法的嵌套循環更慢。
可改寫為列表推斷式 : [ i**2 for i in range(10000)], 這樣就比直接for循環標准寫法要快不少;
此外, 還可以用python自帶的高級函數 map,自動並行計算。
寫為 list(map(lambda i: i**2, range(10000))) 也很快。 map函數和列表推斷式速度差不多。