2013-12-15 77 views
1

我想知道這些與定義之間是否有區別。ListComprehension但不同的順序

[(x,y)| x<-[1..10000], x=2000,y<-[1..100], odd y] 
[(x,y)| x<-[1..10000],y<-[1..100], x=2000, odd y] 

兩者都會生成相同的元組列表。 但是,如果我們的編譯器沒有做任何優化。 我怎樣才能找出哪一個更快。 在這兩種情況下x<-[1..10000]會給我們一個從[1,2.. 20000] since x==2000. 列表y值將評估什麼順序?

+3

對於Haskell他們是equivlaent:都產生一個解析錯誤。 – Ingo

回答

3

事情從左到右執行。把它看作嵌套循環。所以在第一個中,x的測試執行了10000次,而第二個中的執行了1000000次。

向外移動條件加速執行稱爲「過濾器提升」;大衛特納(David Turner)創造的一個術語(ca 1980)。

+0

在第二次執行1000000次? 這怎麼可能是真的? 我們在列表中只有10000個元素 – user2975699

+0

x有10000個值,每個元素有y個100個值。所以有100億(x,y)值。 – augustss

+0

你的意思是1000000(x,y) – user2975699