[Tutor] Python Extensions in C
Rachel-Mikel ArceJaeger
arcejaeger at gmail.com
Thu May 26 23:47:48 CEST 2011
I suppose it's up to the programmer. Personally, I find something like this:
variable += something
a lot easier to read than
temp = something
variable += temp
For me, it's just another variable I have to worry about allocating/deallocating/seeing if it's used anywhere else/accidentally using when I shouldn't.
And I'm sure you're right and the memory tweaks I mentioned aren't that necessary. I only brought them up because James asked about memory management and depending on the program you're using and the size of your inputs, it actually can make a difference. I recall one program I wrote where changing things little things like division and eliminating extra variables that we don't think of as being time-expensive drastically lessened the runtime.
Rachel
On May 26, 2011, at 10:40 AM, Alan Gauld wrote:
> "Rachel-Mikel ArceJaeger" <arcejaeger at gmail.com> wrote
>
>> avg = sumall / count;
>> return avg;
>> Just return sumall/count instead.
>> Then you don't have to waste a register or assignment operation.
>
> Readibility counts in C too. And premature optimisation is even
> more of an evil since C is harder to read to start with....
> This code doesn't need to be saving microseconds (the Python
> object creation will likely consume far more resource and
> speed than these tweaks).
>
>> Division is expensive. Avoid it when you can.
>
> That is entirely dependant on your processor.
> Even on an Intel chip with a math processor it's
> only very slightly more expensive than the other operators,
> compared to memory allocation it's lightning fast.
> And readability counts.
>
>> for (a=0; a != count; a++) {
>> temp = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(seq,a));
>> sumall += temp;
>> Again, save variables and operations. Write this as:
>>
>> for (a=0; a != count; a++) {
>> sumall += PyFloat_AsDouble(PySequence_Fast_GET_ITEM(seq,a));
>
> Again the two Python calls will vastly outweigh the savings.
> And in combining the lines you lose a debug and instrumentation
> opportunity and the chance to introduce a safety check of
> the return values. Reliable code beats fast code.
>
>> It's cheaper when you're using powers of two to just
>> right or left-shift: >> or <<. Since you want to increase
>> by a power of two, do:
>>
>> (avg - PyFloat_AsDouble(PySequence_Fast_GET_ITEM(seq,a) << 1;
>
> While this is sufficiently idiomatic to be understood by
> most C programmers it's still likely to be swamped in effect
> by the Python calls. Readibility still counts, make the
> code express the algorithm not the workings of the CPU.
>
> C can be tweaked to be unreadable or it can be made as
> clear as most other 3GLs. The more unreadable it is the
> more likely it is to harbour bugs. If there is a genuine need
> to be as small and fast as possible then optimise, but hide
> those optimisations in a function if possible. If there is no
> need to optimise at the expense of readability or reliability
> then don't.
>
> Consider these the ravings of an ex maintenance programmer
> who spent far too much of his life deciphering other folks
> "clever" C code... It wasn't clever and it wasn't working!
>
> Alan G.
>
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
R.M. ArceJaeger
Author/Publisher, Platypus Press
Contact: arcejaeger at gmail.com
Website: http://rmarcejaeger.com
More information about the Tutor
mailing list