472,351 Members | 1,439 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,351 software developers and data experts.

Fastest way to loop through each digit in a number?

Hi,
If I have a lot of integers and want do something with each digit as
integer, what is the fastest way to get there?

Eg. Make 12345 into an iterable object, like [1,2,3,4,5] or "12345"

(Btw: What is the English term for this process; itemize? tokenize?
digitize? sequence?)

Some examples:

n = 12345

#1.
s = str(n)
for i in s:
d = int(i)
foo(d)

#2.
nl = map(int, str(n))
for d in nl:
foo(d)

#3.
nl = [int(x) for x in str(n)]
for d in nl:
foo(d)

Of those, I have, a bit surprised, found that #1 is the fastest, and
that #2 using map() is faster than #3 using list comprehension. I also
registered that that repr(n) is about 8% faster than str(n).

Are there faster ways? Is it possible to avoid casting types?

Thanks for all answers!

Jul 18 '05 #1
9 31896
In article <ss********************************@4ax.com>,
Rune Strand <rst@_nospam_.drlug.org._nospam_> wrote:
Hi,
If I have a lot of integers and want do something with each digit as
integer, what is the fastest way to get there?

Eg. Make 12345 into an iterable object, like [1,2,3,4,5] or "12345"


Does it matter what order you process the digits, i.e. least-significant
first vs. most-significant first? If you can do least first, then you
might be best off doing something straight-forward like:

i = 12345
while i:
digit = i % 10
i = i / 10
print digit

although, with the new-style division, I'm not sure if you want / or //.
Jul 18 '05 #2
Rune Strand <rst@_nospam_.drlug.org._nospam_> writes:
You could try timing something like

while n:
n,d = divmod(n, 10)
foo(d)

That processes the digits in reverse order, of course.
Jul 18 '05 #3
Paul Rubin <http://ph****@NOSPAM.invalid> wrote:
You could try timing something like

while n:
n,d = divmod(n, 10)
foo(d)

That processes the digits in reverse order, of course.


Thanks!
It's faster! But Roy Smiths modulus (%) method is even faster. The
order does matter, but even when appending d to a list inside the loop
and reversing it when done, your methods are faster than my initial
groks ;-)
Jul 18 '05 #4

"Rune Strand" <rst@_nospam_.drlug.org._nospam_> wrote in message
news:ss********************************@4ax.com...
Hi,
If I have a lot of integers and want do something with each digit as
integer, what is the fastest way to get there?

Eg. Make 12345 into an iterable object, like [1,2,3,4,5] or "12345"

(Btw: What is the English term for this process; itemize? tokenize?
digitize? sequence?)

Some examples:

You might also look at

zero = ord('0')

and then ord(i)-zero in loop

tjr

Jul 18 '05 #5
n2 = n
while n2 > 0:
d = n2 % 10
n2 /= 10
foo(d)
Jul 18 '05 #6
Roy Smith <ro*@panix.com> wrote:
In article <ss********************************@4ax.com>,
Rune Strand <rst@_nospam_.drlug.org._nospam_> wrote:
Hi,
If I have a lot of integers and want do something with each digit as
integer, what is the fastest way to get there?

Eg. Make 12345 into an iterable object, like [1,2,3,4,5] or "12345"


Does it matter what order you process the digits, i.e. least-significant
first vs. most-significant first? If you can do least first, then you
might be best off doing something straight-forward like:

i = 12345
while i:
digit = i % 10
i = i / 10
print digit

although, with the new-style division, I'm not sure if you want / or //.


He'd surely want truncation, so I don't understand why he could possibly
want / (which in new-style division means true, non-truncating
division), it's surely gotta be //. divmod looks like it might be
better, but from some q&d timeit.py'ing, it seems this approach is
fastest (30% faster than divmod) if these semantics are OK (when i is 0
you get nothing rather than a single 0...) -- map(int, str(i)) is midway
in speed through these purely numeric approaches (with % and // vs with
divmod).
Alex

Jul 18 '05 #7
On Mon, 6 Sep 2004 02:32:46 -0400, "Terry Reedy" <tj*****@udel.edu>
wrote:
You might also look at

zero = ord('0')

and then ord(i)-zero in loop


Thanks! That seems like the fastest solution.
When looping through 1000000, I get these results:
ord : 4.703 (Terry Reedy)
divmod : 10.469 (Paul Rubin)
modulo : 7.625 (Roy Smith)
lst comp: 11.750
map : 9.062
str : 8.219

The modulo and divmod methods includes list.append(d) and
list.reverse() (list.append mapped to list_append).

Jul 18 '05 #8
;-) Somtimes the solition is too obvious... faster than using ord()
is to look up the value in a map:

dictmap = {
'0' : 0,
'1' : 1,
'2' : 2,
'3' : 3,
'4' : 4,
'5' : 5,
'6' : 6,
'7' : 7,
'8' : 8,
'9' : 9
}

def each_dig_in_num(n):
dm = dictmap #faster if local
s = repr(n) #repr is faster than str
for char in s:
foo(dm[char])

Jul 18 '05 #9
On Mon, 06 Sep 2004 04:56:54 +0200, Rune Strand <rst@_nospam_.drlug.org._nospam_> wrote:
Hi,
If I have a lot of integers and want do something with each digit as
integer, what is the fastest way to get there?
How many is "a lot" ? And what are the bounds on your integers' values? ;-)
Keep in mind that whatever you are computing, it is a mapping from imput to output,
and sometimes it pays to implement a subproblem literally as a mapping.
Eg. Make 12345 into an iterable object, like [1,2,3,4,5] or "12345"
E.g., if you had a bazillion numbers that were all positive and five digits max,
then your fastest mapping from number to digit sequence would probably be a precomputed
list or tuple with data like (untested):

digitseqs = [[0],[1],[2],...[8],[9],[1,0],[1,1],[1,2]... [1,2,3,4,5],[1,2,3,4,6], ... [9,9,9,9,9]]

and then there would be no computation of the digits in

for d in digitseqs[number]:
foo(d)

If your numbers are bigger, you can still use the same technique, chunkwise, e.g.,
if you know you have positive 32-bit integers, that's 0<= number <= 1073741824

if number >= 1000000000:
foo(1)
number -= 1000000000
low5 = number % 100000
for d in digitseqs[number//100000]: foo(d)
for d in zdigitseqs[low5]: foo(d)

(zdigitseqs are all 5-digit sequences with leading zeroes included, [[0,0,0,0,0],[0,0,0,0,1], ...])

If your numbers are unbounded, you can still do something along these lines, but
numbers have to be _huge_ before you gain more than you lose in complication.
You could wrap the above in a function like def fooit(number, foo=foofunc): ...
but calls are relatively expensive in time, so you may want to forego the nicer style.

Obviously 100k lists of lists take a fair chunk of memory, and take a little time to
pre-compute, but it may pay off if you have REALLY "a lot" of input numbers ;-)

(Btw: What is the English term for this process; itemize? tokenize?
digitize? sequence?)

Some examples:

n = 12345

#1.
s = str(n)
for i in s:
d = int(i)
foo(d)

#2.
nl = map(int, str(n))
for d in nl:
foo(d)

#3.
nl = [int(x) for x in str(n)]
for d in nl:
foo(d)

Of those, I have, a bit surprised, found that #1 is the fastest, and
that #2 using map() is faster than #3 using list comprehension. I also
registered that that repr(n) is about 8% faster than str(n).

Are there faster ways? Is it possible to avoid casting types?

Thanks for all answers!

I haven't timed the above (or even tested it), but your gains (if any ;-) will depend on
what you can assume about your input data.

Regards,
Bengt Richter
Jul 18 '05 #10

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

Similar topics

8
by: David P. Jessup | last post by:
Well I have seen this posted before and haven't seen much in response. My application has to browse through various folders and find file names....
8
by: Hardrock | last post by:
I encountered some difficulty in implementing dynamic loop nesting. I.e. the number of nesting in a for(...) loop is determined at run time. For...
10
by: zahy[dot]bnaya[At]gmail[dot]com | last post by:
Hello all, Sorry for the stupid question, It's probably has a simple solution but I'm stuck on this for quite a while... I have this piece of...
30
by: Chaos | last post by:
As my first attempt to loop through every pixel of an image, I used for thisY in range(0, thisHeight): for thisX in range(0, thisWidth):...
5
by: eyoung | last post by:
I have a function to check a string to make sure it is 6 digites using the trigger onBlur="CkFrmt(this)" Problem is I've got 4 fields in a row...if...
8
by: Candace | last post by:
I am using the following code to pick off each digit of a number, from right to left. The number I am working with is 84357. So for the first...
52
by: MP | last post by:
Hi trying to begin to learn database using vb6, ado/adox, mdb format, sql (not using access...just mdb format via ado) i need to group the...
2
by: hikmaz | last post by:
I am trying to get the rightmost digits (%10) of a number (taken from the user) and store it into successive array locations and get rid of the...
12
by: beatjunkie27 | last post by:
I am working on a class assignment called Pennies for Pay the object of the program is to receive input for number of days worked. This should be...
0
better678
by: better678 | last post by:
Question: Discuss your understanding of the Java platform. Is the statement "Java is interpreted" correct? Answer: Java is an object-oriented...
0
by: teenabhardwaj | last post by:
How would one discover a valid source for learning news, comfort, and help for engineering designs? Covering through piles of books takes a lot of...
1
by: Kemmylinns12 | last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and...
0
jalbright99669
by: jalbright99669 | last post by:
Am having a bit of a time with URL Rewrite. I need to incorporate http to https redirect with a reverse proxy. I have the URL Rewrite rules made...
0
by: antdb | last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine In the overall architecture, a new "hyper-convergence" concept was...
0
by: Matthew3360 | last post by:
Hi there. I have been struggling to find out how to use a variable as my location in my header redirect function. Here is my code. ...
2
by: Matthew3360 | last post by:
Hi, I have a python app that i want to be able to get variables from a php page on my webserver. My python app is on my computer. How would I make it...
0
by: AndyPSV | last post by:
HOW CAN I CREATE AN AI with an .executable file that would suck all files in the folder and on my computerHOW CAN I CREATE AN AI with an .executable...
0
hi
by: WisdomUfot | last post by:
It's an interesting question you've got about how Gmail hides the HTTP referrer when a link in an email is clicked. While I don't have the specific...

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.