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函数和列表推断式速度差不多。