views:

480

answers:

7

We can do numeric iteration like:

for i in xrange(10):
    print i,

and in C-style:

i = 0
while i < 10:
    print i,
    i = i + 1

Yes, I know, the first one is less error-prone, more pythonic but is it fast enough as C-style version?

PS. I'm from C++ planet and pretty new on Python one.

+13  A: 

Who cares? Seriously. If you want to know, use timeit package (you can invoke it from command line with -m).

But it doesn't matter at all, because the difference is negligible. And in general, Python is not a language that you choose if you want speed.

J S
Yes, and in all likelihood, each Python implemenattion could do this differently. Trust the compiler. I recall the time when C code SHOULD use "do-while" or "while" to be faster... according to what happened on some old broken compiler ten years ago. This sounds like the same kind of thinking.
jakobengblom2
Python offers speed not if you optimize your loops but if you think about your algorithms and data structures, which may be easier to adapt than in C.
kaizer.se
+3  A: 

They are both to avoid :-)

Generally speaking, each time I see an iteration over numbers, I see some non-pythonic code, that could be expressed in a better way using iterations over lists or generators.
Actually, I've said "pythonic", but it is all about readability. Using idiomatic code will increase readability, and ultimately also performance, because the compiler will better know how to optimize it.

Roberto Liffredo
Roberto it woudl help beginner python programmers if you show us how you would do teh above in a pythonic way
Edwards
+1 Very true, although it's not a direct answer to the question. Also, you usually iterate over some list or the like and just need the numbers as additional information---and that's what `enumerate()` is for.
balpha
The code snippet doesn't have enough context. But the classic mistake is `for i in xrange(len(A)): a[i]...` that's just wrong.
S.Lott
@Edwards: as Steven said, there's not enough context to give a "pythonic" version of the code. Usually, you should try not to think in terms of indexes, but of data structures (lists, dictionaries, etc). Once you've done that shift, everything's much easier.
Roberto Liffredo
+8  A: 

I am sure the while version is slower. Python will have to lookup the add operation for the integer object on each turn of the loop etc, it is not pure C just because it looks like it!

And if you want a pythonic version of exactly the above, use:

print " ".join(str(i) for i in xrange(10))


Edit: My timings look like this. This is just a silly running loop without printing, just to show you what writing out "i += 1" etc costs in Python.

$ python -mtimeit "i=0" "while i < 1000: i+=1"
1000 loops, best of 3: 303 usec per loop
$ python -mtimeit "for i in xrange(1000): pass"
10000 loops, best of 3: 120 usec per loop
kaizer.se
in Python 3, where print is a function, just say `print(*range(10))`
kaizer.se
@kaizer.se: you can do so in python 2.6 with `from __future__ import print_function`
nosklo
nosklo: right you are. I use python2.5. (I'm sure the excercises in my answer are pointless, but Edwards asked how to do it in a comment to Roberto Liffredo's answer.)
kaizer.se
Thanks a lot! "Python will have to lookup the add operation for the integer object on each turn of the loop etc" - this is exactly that I don't know: how it works. Could you recommend some good source about Python internals?
bocco
bocco: There must be a stackoverflow question already asked that can answer that much better than I. The official docs are to recommend, you can read into any area there http://docs.python.org/
kaizer.se
+3  A: 

The first one.

You mean, faster to develop, right?

PS: It doesn't matter, machines these days are so fast that it is meaningless to ponder on micro optimizations, prior to identifying the bottlenecks using a thorough profiler.

Lakshman Prasad
A: 

Well, if you are after efficiency in numerical code, you ought to use numpy and scipy. Your integration can be quickly written as numpy.sum( numpy.arange( 10 ) )

Jose
A: 

If your program is too slow, try using psyco.

Don't worry about the kind of micro-optimisation in your question. Write your program to be maintainable (which includes following standard Python style so other programmers can read it easier).

user9876
A: 

In Python, the shorter and clearer version is always better. If I am not mistaken the range and xrange functions are not native, if you try xrange(sys.maxint+1) you will get an overflow error.

Besides, what the hell could this be useful for? If you are just printing 10 numbers, then surely readability counts a thousand times more - and I don't think you're going to print over a million numbers...

ooboo