[pypy-commit] pypy faster-sum: Try to make a faster built-in sum function
justinpeel
noreply at buildbot.pypy.org
Mon Aug 29 08:57:46 CEST 2011
Author: Justin Peel <notmuchtotell at gmail.com>
Branch: faster-sum
Changeset: r46881:e4d3269945d5
Date: 2011-08-29 00:57 -0600
http://bitbucket.org/pypy/pypy/changeset/e4d3269945d5/
Log: Try to make a faster built-in sum function
diff --git a/pypy/module/__builtin__/functional.py b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -8,7 +8,7 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
from pypy.interpreter.baseobjspace import Wrappable
-from pypy.rlib.rarithmetic import r_uint, intmask
+from pypy.rlib.rarithmetic import ovfcheck, r_uint, intmask
from pypy.rlib.objectmodel import specialize
from pypy.rlib.rbigint import rbigint
@@ -336,6 +336,46 @@
raise OperationError(space.w_TypeError, space.wrap(msg))
w_iter = space.iter(w_sequence)
w_last = w_start
+ if space.isinstance_w(w_start, space.w_int):
+ result_i = space.int_w(w_start)
+ while True:
+ try:
+ w_item = space.next(w_iter)
+ except OperationError, e:
+ if not e.match(space, space.w_StopIteration):
+ raise
+ return space.wrap(result_i)
+ if space.isinstance_w(w_item, space.w_int):
+ num = space.int_w(w_item)
+ try:
+ x = ovfcheck(result_i + num)
+ except OverflowError, e:
+ pass
+ else:
+ result_i = x
+ continue
+ w_last = space.wrap(result_i)
+ w_last = space.add(w_last, w_item)
+ elif space.isinstance_w(w_start, space.w_float):
+ result_f = space.float_w(w_start)
+ while True:
+ try:
+ w_item = space.next(w_iter)
+ except OperationError, e:
+ if not e.match(space, space.w_StopIteration):
+ raise
+ return space.wrap(result_f)
+ if space.isinstance_w(w_item, space.w_float):
+ num_f = space.float_w(w_item)
+ result_f += space.w_float(w_item)
+ continue
+ if space.isinstance_w(w_item, space.w_int):
+ num_f = float(space.w_int(w_item))
+ result_f += space.w_float(w_item)
+ continue
+ w_last = space.wrap(result_f)
+ w_last = space.add(w_last, w_item)
+
while True:
try:
w_next = space.next(w_iter)
More information about the pypy-commit
mailing list