title: How do I know why running my code is taking too long?
body: <p>I understand that my code's complexity isn't the best, and I thought it might take 3 - 6 minutes running, but I gave it 15 minutes and it didn't stop. 
  How do I know if it got stuck somewhere or it's just still running?
  and How can I improve it?</p>
  
  <pre><code>import random
  import time 
  def is_prime(m):
      """ probabilistic test for compositeness of m&gt;30
      adds a trivial sieve to quickly eliminate divisibility
      by small primes. """
      if m in [2,3,5,7,11,13,17,19,23,29]:
          return True    # treats small primes separately
      for prime in [2,3,5,7,11,13,17,19,23,29]:
          if m % prime == 0:
              return False
      for i in range(0,100):
          a = random.randint(1,m-1) # a is a random integer in [1..m-1]
          if pow(a,m-1,m) != 1:
                  return False
      return True
  
  
  def order_safe_prime(g,p):
  
      """ computes the order of g modulo a safe prime, p """
      if g&lt;1 or g&gt;p-1:
          return str.format("g={} is out of range", g)
      elif not is_prime(p):
          return str.format("{} is not a prime", p)
      q=(p-1)//2
      if not is_prime(q):
          return str.format("q={} is not a prime", (p-1)//2)
      else:
          if g==1:
              return 1
          if g==p-1:
              return 2
          if pow(g,q,p)==1:
              return q
          if pow(g,p-1,p)==1:
              return p-1
  
  
  
  def stats_ord_secure(p,times=10000):
      cnt1=0
      cnt2=0
      for i in range(times):
          g=random.randint(2,p-2)
          if order_safe_prime(g,p)==(p-1)/2:
              cnt1+=1
          if order_safe_prime(g,p)==(p-1):
              cnt2+=1
      return ((cnt1/times,cnt2/times))
  </code></pre>
  
  <p>For example running :</p>
  
  <pre><code>&gt;&gt;&gt;stats_ord_secure((2**1001)+188151)
  </code></pre>
  
  <p>would take more than 15 minutes !</p>