Search code examples
pythonpython-2.7progress-barprimesprogress

Python Displaying Progress


I have this python code to generate prime numbers. I added a little piece of code (between # Start progress code and # End progress code) to display the progress of the operation but it slowed down the operation.

#!/usr/bin/python

a = input("Enter a number: ")
f = open('data.log', 'w')

for x in range (2, a):
  p = 1
  # Start progress code
  s = (float(x)/float(a))*100
  print '\rProcessing     ' + str(s) + '%',
  # End progress code
  for i in range(2, x-1):
    c = x % i
    if c == 0:
      p = 0
      break
  if p != 0:
    f.write(str(x) + ", ")

print '\rData written to \'data.log\'. Press Enter to exit...'

raw_input()

My question is how to show the progress of the operation without slowing down the actual code/loop. Thanks in advance ;-)


Solution

  • To answer your question I/O is very expensive, and so printing out your progress will have a huge impact on performance. I would avoid printing if possible.

    If you are concerned about speed, there is a very nice optimization you can use to greatly speed up your code.

    For you inner for loop, instead of

      for i in range(2, x-1):
        c = x % i
        if c == 0:
          p = 0
          break
    

    use

      for i in range(2, x-1**(1.0/2)):
        c = x % i
        if c == 0:
          p = 0
          break
    

    You only need to iterate from the range of 2 to the square root of the number you are primality testing.

    You can use this optimization to offset any performance loss from printing your progress.