473,770 Members | 1,652 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

strange sum behavior

while playing about with inheriting from list to be able to cache macro
properties i noticed this, the rate of summing a list seems to be over linear?

its nearly 3 times faster to sum the sums of smaller lists?
from time import clock

l=range(0,10000 00)

start=clock()
print sum(l),
print clock()-start

# now sum a list of the sums of 1000 slices.
start=clock()
print sum([sum(l[x:x+1000]) for x in xrange(0,len(l) ,1000)]),
print clock()-start

# repeat
start=clock()
print sum(l),
print clock()-start

# output from 500MHz AMD K62 64Mb Python 2.3.3 (#51, Dec 18 2003, 20:22:39)
[MSC v.1200 32 bit (Intel)] on win32
#499999500000 1.89348044721
#499999500000 0.731985115406
#499999500000 1.90818149818
Jul 18 '05 #1
2 1659
I get similar results from
Python 2.4a0 (#1, Feb 19 2004, 17:19:10)
[GCC 3.3.2 20031022 (Red Hat Linux 3.3.2-1)] on linux2

$ timeit -s 'l=range(0,1000 000)' 'sum(l)'
10 loops, best of 3: 985 msec per loop
$ timeit -s 'l=range(0,1000 000)' 'sum([sum(l[x:x+1000]) for x in xrange(0,len(l) ,1000)])'
10 loops, best of 3: 352 msec per loop

I suspect the reason is that the top loop has many operations on Python
longs (unbounded ints), while the bottom loop has relatively few. Here's a
use of sum() that doesn't switch from ints to longs:
$ timeit -s 'l=[0]*1000000' 'sum(l)'
10 loops, best of 3: 241 msec per loop
$ timeit -s 'l=[0]*1000000' 'sum([sum(l[x:x+1000]) for x in xrange(0,len(l) ,1000)])'
10 loops, best of 3: 285 msec per loop

.... the nested loop is slower, as it should be.

Jeff

Jul 18 '05 #2
simon place wrote:
while playing about with inheriting from list to be able to cache macro
properties i noticed this, the rate of summing a list seems to be over
linear?

its nearly 3 times faster to sum the sums of smaller lists?
from time import clock

l=range(0,10000 00)

start=clock()
print sum(l),
print clock()-start

# now sum a list of the sums of 1000 slices.
start=clock()
print sum([sum(l[x:x+1000]) for x in xrange(0,len(l) ,1000)]),
print clock()-start

# repeat
start=clock()
print sum(l),
print clock()-start

# output from 500MHz AMD K62 64Mb Python 2.3.3 (#51, Dec 18 2003,
20:22:39) [MSC v.1200 32 bit (Intel)] on win32
#499999500000 1.89348044721
#499999500000 0.731985115406
#499999500000 1.90818149818


You are confusing the behavior of summing long integers with that of
summing integers.

When you sum from 0 to 65,534, your sum is just under sys.maxint on (32
bit machines). When you sum from 0 to 65,535, your sum is just over
sys.maxint (on 32 bit machines), and becomes a Python Long. It is no
longer a single add instruction when running on the core processor when
adding the running total with the next number, it is multiple
instructions. If you check the implementation, Python ends up doing
manual adds and carries on unsigned C shorts, which makes up each
'digit' in a Python long.

When you break the pieces up into blocks of 1000, the largest sum is for
998,999 to 999,999, which is 999,499,500; which you will notice is
smaller than sys.maxint (on 32 bit machines), and at worst only results
in 1000 Python long adds, as compared with 934464 long additions in your
original method (that factor of 934 times as many long additions is crazy).

The fact that it is /only/ 3 times slower shows us that Python's long
integer implementation for smaller long integers works pretty damn well.

- Josiah
Jul 18 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
3461
by: Marcus | last post by:
Hello, I recently converted all my existing MyISAM tables to InnoDB tables through phpmyadmin. I noticed some strange behavior whenever I would refresh the screen, as phpmyadmin would report different numbers for the cardinality of the primary key (i.e. one minute it would say cardinality 388, then 244 on refresh, then something else), and it would report different values for the number of rows when mousing over the table names on the...
36
3455
by: Dmitriy Iassenev | last post by:
hi, I found an interesting thing in operator behaviour in C++ : int i=1; printf("%d",i++ + i++); I think the value of the expression "i++ + i++" _must_ be 3, but all the compilers I tested print 2.
0
1709
by: thulsey | last post by:
Hi all, I've got some strange behavior happening in Firefox and Safari (Khtml and Gecko) that displays *almost* fine in IE6.0 (still trying to get pixels to line up, anal anal anal...) To speed things up, and to avoid any problems with looking through the css file, I'll say first that I based the navigation menu on the "Suckerfish Dropdown menu" online demo over at htmldog. (http://www.htmldog.com/articles/suckerfish/dropdowns/). In...
1
1507
by: Alexander Inochkin | last post by:
Hi! I found same strange behavior of ASP.NET. It is possible this is the bug. Follow the steps:
0
3574
by: ivb | last post by:
Hi all, I am using DB2 8.1.11.1 on NT with ASP.NET 1.1 When application make connection to database (via ADO.NET), it set "Connection timeout" parameter to 30 seconds. After, when my webpage requests database, and query execution time exceeds 30 seconds, the following error reported: ===
6
2273
by: Joseph Geretz | last post by:
Writing an Outlook AddIn with C#. For the user interface within Outlook I'm adding matching pairs of Toolbar buttons and Menu items. All of the buttons and menu items are wired up to send events to the same method (aka delegate?). I use the Tag property within this method to determine what user action is taking place. Very simple: When adding toolbar button: tbButton.Click += new...
3
1518
by: sara | last post by:
Very strange behavior, but I suspect some is A2K and some might be for me to correct. Just trying to see if anyone can help and advise. We have a database that's been running for a few years with no problems. We continuously add queries and reports. We're up to about 700 queries (no, not all are used and most are parameter queries - the business asks a LOT of questions!), and under 250 reports and fewer than 15 forms. Data is...
1
2978
by: Nicholas Palmer | last post by:
Hi all, Got a question about the AspCompat=true page property. First a little background. We have an ASP.NET app that uses two COM components. The first is the Microsoft OWC 11 components and the second is a custom VB6 COM component. So I was reading about AspCompat=true and it seemed like it would be a good fit for our app. From what I can tell both of the COM components that we are using are STA and we are creating the components in...
19
1756
by: david | last post by:
I took old code and decided to modify it a bit, and I just noticed that it does not compile at all and before server one of severs (main) crashed in the system it was working fine (I am really sure that I remember that). Now I am getting this error: $ make g++ -Wall -ansi -pedantic -c pirma_lib.cpp g++ -Wall -ansi -pedantic -c pirma.cpp In file included from pirma.cpp:2:
20
2244
by: Pilcrow | last post by:
This behavior seems very strange to me, but I imagine that someone will be able to 'explain' it in terms of the famous C standard. -------------------- code ----------------------------------- #include <stdio.h> int main (void) { char xx="abcd"; char * p1 = xx;
0
10232
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10059
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10008
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9873
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
8891
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
5313
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5454
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
3578
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2822
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.