问题在哪里?
如上所述,初始测试不会将苹果与苹果进行比较:
更不用说python-2.7,range()它确实创建了一个 RAM 分配的数据结构,而xrange()类似于python-3重新制定的对象(如下所示),一个生成器- 永远无法与任何智能 RAM 分配的数据结构相提并论。
>>> L_above_InCACHE_computing = [ range( int( 1E24 ) ) ] # list is created
>>> L_above_InCACHE_computing.count( 0 ) # list has no 0 in
0
>>> L_above_InCACHE_computing.count( range( int( 1E24 ) ) )# list has this in
1
生成器的对象内在.__len__()吐出长度,仍然没有发生计数,是吗?(很高兴它没有,它甚至不适合~ 10^20 [TB]RAM ...,但它可以作为对象“存在”在 py3+ 中)
>>> print( L[0].__doc__ )
range(stop) -> range object
range(start, stop[, step]) -> range object
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
定量公平测试?需要更好的测试工程细节:
远远超过几十 MB,以避免来自 InCACHE 计算工件的错误期望,它永远不会扩展到现实世界的问题大小:
>>> L_above_InCACHE_computing = [ range( int( 1E24 ) ) ]
>>> L_above_InCACHE_computing[0]
range(0, 999999999999999983222784)
>>> print( L_above_InCACHE_computing[0].__len__() )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C ssize_t
进入 RAM 可行,但高于 InCACHE 水平尺寸:
# L_aRunABLE_above_InCACHE_computing = [ range( int( 1E9 ) ) ] # ~8+GB ->array
# would have no sense to test
# a benchmark on an array.array().count( something ) within an InCACHE horizon
直接进入numpy数组?
绝对是测试的明智之举。向量化的内部性可能会令人惊讶,并且经常会做很多事情:o)
很大程度上取决于您的其他代码,如果 numpy-strengths 甚至可以提升您代码库的其他部分。最后但并非最不重要的一点是,谨防过早的优化和扩展。[TIME]如果可以在 -domain 上花费更多,则可以应对一些-domain 陷阱[SPACE],但最危险的是丢失 InCACHE-locality,在这种情况下没有任何折衷可能会有所帮助。因此,最好不要过早锁定有希望的细节,以失去全球范围的性能目标为代价。