>On Sat, Sep 15, 2012 at 4:43 AM, eryksun <eryk...@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. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor