python - List comprehension assignment/comparison fails after 256 -
this question has answer here:
- “is” operator behaves unexpectedly integers 10 answers
i tried find performance difference between slice assignment , regular assignment lists. here code:
import time n = 1000 = list(range(n)) b = list(range(n)) time1 = time.time() in range(n): = [x x in if x not i] time2 = time.time() in range(n): b[:] = [x x in b if x not i] time3 = time.time() print print b print time2 - time1 print time3 - time2 my expectation that, each list a , b, remove 1 element @ time, print a , print b both print empty lists. instead, seem print starting lists, first 256 elements missing.
they both print:
[257, 258, 259 ... n-1] what happening?
i'm using python 2.7.6.
the problem you're using is instead of ==.
the former checks object identity, not equality. there's no reason believe evaluating, say, 300+1 twice give same int object, they'll both give int objects value 301.
this happens "work" numbers 256 because particular python implementation* happens intern integers 256. @ startup, creates singleton object number 1, singleton object 2, , on. time expression evaluates number 1, gives object, instead of new one.**
needless say, should not rely on optimization.
* iirc, every version of cpython 1.x days 3.5 defaults behavior integers -5 256, can change limits, or turn off feature, @ build time, , different implementation might different.
** if you're wondering how works in cpython, @ c api level, pylong_fromlong looking numbers -5 256 in array of singleton values. can see 3.4 version of code, example, here; macro check_small_int , actual function get_small_int calls, , static array function uses, in same file, near top.
Comments
Post a Comment