list.pop(0) vs. collections.dequeue
Steve Howell
showell30 at yahoo.com
Sat Jan 23 02:43:03 EST 2010
On Jan 22, 11:10 pm, a... at pythoncraft.com (Aahz) wrote:
>
> >I know Python's number one concern will never be speed, but if Python
> >makes an O(1) operation into an unnecessarily O(N) operation for no
> >good reasons other than "it's too complicated, " or it "adds another
> >pointer to the structure," or "it adds another conditional check to
> >list_ass_slice for operations that aren't popping off the top," I
> >think it's reasonable to challenge the design philosophy.
>
> "Rough consensus and running code."
>
> You have a good point, but nobody will ever give your idea serious
> attention until there's a patch and benchmarks.
Here is a benchmark of O(N*N) vs. O(N) for two C programs. One does
memmove; the other simply advances the pointer.
showell at showell-laptop:~$ time ./slow
real 0m1.446s
user 0m1.444s
sys 0m0.004s
showell at showell-laptop:~$ time ./fast
real 0m0.003s
user 0m0.004s
sys 0m0.000s
showell at showell-laptop:~$ diff slow.c fast.c
23,24c23
< lst.size -= 1;
< memmove(lst.p, lst.p + 1, lst.size);
---
> lst.p += 1;
showell at showell-laptop:~$ cat slow.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct ob_item {
int whatever;
};
struct list {
struct ob_item *p;
int size;
};
struct list make_list(int n)
{
struct list lst;
lst.p = malloc(n);
lst.size = n;
return lst;
}
void list_pop_left(struct list lst) {
lst.size -= 1;
memmove(lst.p, lst.p + 1, lst.size);
}
int main() {
struct list lst;
int i;
int n = 40000;
int t;
lst = make_list(n);
for (i = 0; i < n; ++i) {
list_pop_left(lst);
}
}
More information about the Python-list
mailing list