Commit Graph

82 Commits

Author SHA1 Message Date
Victor Stinner
e7f516cbb8 Issue #19512: _count_elements() of _collections reuses PyId_get identifier
instead of literal "get" string
2013-11-06 23:52:55 +01:00
Raymond Hettinger
07573d7b24 merge 2013-10-04 16:52:39 -07:00
Raymond Hettinger
cb1d96f782 Issue #18594: Make the C code more closely match the pure python code. 2013-10-04 16:51:02 -07:00
Raymond Hettinger
75f65e368e merge 2013-10-01 21:38:37 -07:00
Raymond Hettinger
224c87d60c Issue #18594: Fix the fallback path in collections.Counter(). 2013-10-01 21:36:09 -07:00
Raymond Hettinger
c13516b0a0 merge 2013-10-01 01:00:59 -07:00
Raymond Hettinger
2ff2190b62 Issue #18594: Fix the fast path for collections.Counter().
The path wasn't being taken due to an over-restrictive type check.
2013-10-01 00:55:43 -07:00
Raymond Hettinger
77578204d6 Restore the data block size to 62.
The former block size traded away good fit within cache lines in
order to gain faster division in deque_item().  However, compilers
are getting smarter and can now replace the slow division operation
with a fast integer multiply and right shift.  Accordingly, it makes
sense to go back to a size that lets blocks neatly fill entire
cache-lines.

GCC-4.8 and CLANG 4.0 both compute "x // 62" with something
roughly equivalent to "x * 9520900167075897609 >> 69".
2013-07-28 02:39:49 -07:00
Raymond Hettinger
3223dd5c22 Assertions key off NDEBUG 2013-07-26 23:14:22 -07:00
Raymond Hettinger
b97cc49c3a Minor code simplification by eliminating an unnecessary temporary variable. 2013-07-21 01:51:07 -07:00
Raymond Hettinger
90dea4ce43 Tweak the deque struct by moving the least used fields (maxlen and weakref) to the end. 2013-07-13 22:30:25 -07:00
Raymond Hettinger
840533bf1c Use a do-while loop in the inner loop for rotate (m is always greater than zero). 2013-07-13 17:03:58 -07:00
Raymond Hettinger
3959af9b2a Move the freeblock() call outside the main loop to speed-up and simplify the block re-use logic. 2013-07-13 02:34:08 -07:00
Raymond Hettinger
d9c116ca40 Add a spacing saving heuristic to deque's extend methods 2013-07-09 00:13:21 -07:00
Raymond Hettinger
b385529ddf Fix #ifdef 2013-07-07 02:07:23 -10:00
Raymond Hettinger
82df925451 Use macros for marking and checking endpoints in the doubly-linked list of blocks.
* Add comment explaining the endpoint checks
* Only do the checks in a debug build
* Simplify newblock() to only require a length argument
  and leave the link updates to the calling code.
* Also add comment for the freelisting logic.
2013-07-07 01:43:42 -10:00
Raymond Hettinger
f3a67b7e57 Improve variable names in deque_count() 2013-07-06 17:49:06 -10:00
Raymond Hettinger
df715ba54d Apply the PyObject_VAR_HEAD and Py_SIZE macros
to be consistent with practices in other modules.
2013-07-06 13:01:13 -10:00
Raymond Hettinger
5bfa8671bc Refactor deque_traverse().
Hoist conditional expression out of the loop.
Use rightblock as the guard instead of checking for NULL.
2013-07-06 11:58:09 -10:00
Raymond Hettinger
98054b4c1b Remove unnecessary branches from count() and reverse(). 2013-07-06 09:07:06 -10:00
Raymond Hettinger
de68e0cf0e Speed-up deque indexing by changing the deque block length to a power of two.
The division and modulo calculation in deque_item() can be compiled
to fast bitwise operations when the BLOCKLEN is a power of two.

Timing before:

 ~/cpython $ py -m timeit -r7 -s 'from collections import deque' -s 'd=deque(range(10))' 'd[5]'
10000000 loops, best of 7: 0.0627 usec per loop

Timing after:

~/cpython $ py -m timeit -r7 -s 'from collections import deque' -s 'd=deque(range(10))' 'd[5]'
10000000 loops, best of 7: 0.0581 usec per loop
2013-07-05 18:05:29 -10:00
Raymond Hettinger
20b0f87e1d Misc improvements to collections.deque()
* Clarified comment on the impact of BLOCKLEN on deque_index
  (with a power-of-two, the division and modulo
   computations are done with a right-shift and bitwise-and).

* Clarified comment on the overflow check to note that
  it is general and not just applicable the 64-bit builds.

* In deque._rotate(), the "deque->" indirections are
  factored-out of the loop (loop invariant code motion),
  leaving the code cleaner looking and slightly faster.

* In deque._rotate(), replaced the memcpy() with an
  equivalent loop.  That saved the memcpy setup time
  and allowed the pointers to move in their natural
  leftward and rightward directions.

See comparative timings at:  http://pastebin.com/p0RJnT5N
2013-06-23 15:44:33 -07:00
Raymond Hettinger
986bbfc079 Backport deque.rotate() improvements. 2013-02-09 20:00:55 -05:00
Raymond Hettinger
59cf23ab07 Minor tweaks to varnames, declarations, and comments. 2013-02-07 00:57:19 -05:00
Raymond Hettinger
1f0044c473 Minor variable access clean-ups for deque.rotate(). 2013-02-05 01:30:46 -05:00
Raymond Hettinger
a4409c18eb Minor edits: Tighten-up the halflen logic and touch-up the assertions and comments. 2013-02-04 00:08:12 -05:00
Raymond Hettinger
3a9ae7fd98 Issue 16398: One more assertion for good measure. 2013-02-02 12:26:37 -08:00
Raymond Hettinger
231ee4dc9d Issue 16398: Add assertions to show why memcmp is safe. 2013-02-02 11:24:43 -08:00
Raymond Hettinger
21777acd68 Issue 16398: Use memcpy() in deque.rotate(). 2013-02-02 09:56:08 -08:00
Benjamin Peterson
fa3965ab76 merge 3.3 2013-01-12 21:22:33 -05:00
Benjamin Peterson
0e5c48a917 make deque_clear void, since it's infallible 2013-01-12 21:22:18 -05:00
Raymond Hettinger
464d89b3ce Issue #16398: Optimize deque.rotate() 2013-01-11 22:29:50 -08:00
Andrew Svetlov
796c443f3d Merge: fix docstring for deque ctor to mark iterable parameter optional 2012-10-31 11:51:13 +02:00
Andrew Svetlov
6a5c7c341a Fix docstring for deque ctor to mark iterable parameter optional 2012-10-31 11:50:40 +02:00
Jesus Cea
1659b75189 MERGE: Closes #15469: Correct __sizeof__ support for deque 2012-08-03 14:52:12 +02:00
Jesus Cea
16e2fca47e Closes #15469: Correct __sizeof__ support for deque 2012-08-03 14:49:42 +02:00
Kristján Valur Jónsson
31668b8f7a Issue #14288: Serialization support for builtin iterators. 2012-04-03 10:49:41 +00:00
Antoine Pitrou
15af7b4a4f Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
Patch by Suman Saha.
2012-02-15 02:43:47 +01:00
Antoine Pitrou
f5f1fe0cb5 Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
Patch by Suman Saha.
2012-02-15 02:42:46 +01:00
Martin v. Löwis
bd928fef42 Rename _Py_identifier to _Py_IDENTIFIER. 2011-10-14 10:20:37 +02:00
Martin v. Löwis
1ee1b6fe0d Use identifier API for PyObject_GetAttrString. 2011-10-10 18:11:30 +02:00
Martin v. Löwis
afe55bba33 Add API for static strings, primarily good for identifiers.
Thanks to Konrad Schöbel and Jasper Schulz for helping with the mass-editing.
2011-10-09 10:38:36 +02:00
Brian Curtin
dfc80e3d97 Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
The macro was introduced in #12724.
2011-08-10 20:28:54 -05:00
Victor Stinner
a154b5cea4 Simplify _count_elements() in _collections
PyIter_Next() cannot return a PyExc_StopIteration: it clears this exception.
2011-04-20 23:23:52 +02:00
Raymond Hettinger
4974705a02 Issue 11713: clarify docstring for collections.deque() 2011-03-29 17:36:31 -07:00
Raymond Hettinger
512d2cc643 Issue #11004: Repair edge case in deque.count().
(Reviewed by Georg Brandl.)

Also made similar changes to deque.reverse() though this wasn't
strictly necessary (the edge case cannot occur with two pointers
moving to meet in the middle).  Making the change in reverse()
was more a matter of future-proofing.
2011-01-25 21:32:39 +00:00
Raymond Hettinger
426e052a4f Make C helper function more closely match the pure python version, and add tests. 2011-01-03 02:12:02 +00:00
Raymond Hettinger
96f3410ebe Issue 10667: Fast path for collections.Counter 2010-12-15 16:30:37 +00:00
Georg Brandl
f038b32d0b Remove more unneeded casts to hashfunc. 2010-10-18 07:35:09 +00:00
Antoine Pitrou
554f33407c Fix <deque iterator>.__length_hint__() under 64-bit Windows. 2010-08-17 18:30:06 +00:00