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
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
Antoine Pitrou
f95a1b3c53
Recorded merge of revisions 81029 via svnmerge from
...
svn+ssh://pythondev@svn.python.org/python/trunk
........
r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines
Untabify C files. Will watch buildbots.
........
2010-05-09 15:52:27 +00:00
Raymond Hettinger
44459debc6
Add count() method to collections.deque().
2010-04-03 23:20:46 +00:00
Raymond Hettinger
3f9afd816d
Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
2009-12-10 03:03:02 +00:00
Raymond Hettinger
e5fdedbeda
Add a reverse() method to collections.deque().
2009-12-10 00:47:21 +00:00
Raymond Hettinger
54628fa7c0
Issue 6637: defaultdict.copy() failed with an empty factory.
2009-08-04 19:16:39 +00:00
Raymond Hettinger
5bb0f0e072
For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
2009-03-10 12:56:32 +00:00
Raymond Hettinger
060c7f6bba
Small optimization for corner case where maxlen==0.
2009-03-10 09:36:07 +00:00
Mark Dickinson
e94c679df0
Issue #1717 : rename tp_compare to tp_reserved. I'll change the
...
type of tp_compare in a separate commit, for ease of reversion
should things go wrong.
2009-02-02 20:36:42 +00:00