A nice illustration of the cost of creating and destroying objects in Python
Here are two functions (they may look familiar):
def xiter(max): for _ in xrange(max): pass from itertools import repeat def riter(max): for _ in repeat(None, max): pass
The first thing that makes these functions interesting is that xiter()
runs about 1.25 times as slowly as riter()
, once you test with a
large enough max
to drown out startup effects. This is interesting
because these functions are almost identical, both in generated bytecode
and in what happens at runtime. Both xrange()
and repeat()
create
and return iterator objects, which the for
loop then traverses. Both
iterator objects are implemented in C, as are xrange()
and repeat()
themselves, and the other operations are the same between both
functions.
In short, the difference between these two functions is how the
two iterator objects behave. And the big difference here is object
allocation and deallocation; repeat()
's iterator returns the same
pre-existing object max
times while xrange()
's iterator returns
max
different integer objects, most of which are created and then
destroyed. While it's possible that the C code for one is much worse
than the C code for the other, it's reasonable to assume that this 1.25
times performance difference between the two functions is entirely
due to the extra overhead of allocating and deallocating all of those
integer objects. This is about as pure an illustration of the cost
of object creation and deletion as you could ask for.
(Note that the performance difference is not due to the overhead of
having a lot of integer objects around. Only one integer object is alive
at any given time in the xiter()
version.)
|
|