[Tutor] is this use or abuse of __getitem__ ?
Albert-Jan Roskam
fomcl at yahoo.com
Sat Sep 15 16:18:26 CEST 2012
>On Sat, Sep 15, 2012 at 4:43 AM, eryksun <eryksun at gmail.com> wrote:
>
>> else:
>> start = index(self.nCases + key if key < 0 else key) # may
>> raise TypeError
>> stop = start + 1
>> step = 1
>
>
>Gmail is such a pain sometimes. I should have called index first anyway:
>
> key = index(key) # may raise TypeError
> start = key + self.nCases if key < 0 else key
> stop = start + 1
> step = 1
>
Thanks, I hadn't noticed this yet. I am refactoring some of the rest of my code and I hadn't run anything yet. My code has two methods that return record(s): an iterator (__getitem__) and a generator (readFile, which is also called by __enter__). Shouldn't I also take the possibility of a MemoryError into account when the caller does something like data[:10**8]? It may no longer fit into memory, esp. when the dataset is also wide.
>
>> records = []
>> for i in range(start, stop, step):
>> ...
>> records.append(record)
>
>
>You can boost the performance here a bit by caching the append method.
>This avoids a LOAD_ATTR operation on each iteration:
>
> records = []
> append = records.append
> for i in range(start, stop, step):
> ...
> append(record)
I knew that trick from http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Avoiding_dots... but I didn't know about LOAD_ATTR. Is a list comprehension still faster than this? Does it also mean that e.g. "from ctypes import *" (--> c_long()) is faster than "import ctypes" (--> ctypes.c_long()). I am now putting as much as possible in __init__. I don't like the first way of importing at all.
More information about the Tutor
mailing list