Unusual Speed Difference between Python and C++

后端 未结 17 2254
庸人自扰
庸人自扰 2020-12-22 21:25

I recently wrote a short algorithm to calculate happy numbers in python. The program allows you to pick an upper bound and it will determine all the happy numbers below it.

17条回答
  •  無奈伤痛
    2020-12-22 22:01

    Here's a C# version:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace CSharp
    {
      class Program
      {
        static void Main (string [] args)
        {
          while (true)
          {
            Console.Write ("Pick an upper bound: ");
    
            String
              input = Console.ReadLine ();
    
            uint
              upper_bound;
    
            if (uint.TryParse (input, out upper_bound))
            {
              DateTime
                start = DateTime.Now;
    
              CalcHappyNumbers (upper_bound);
    
              DateTime
                end = DateTime.Now;
    
              TimeSpan
                span = end - start;
    
              Console.WriteLine ("Time taken = " + span.TotalSeconds + " seconds.");
            }
            else
            {
              Console.WriteLine ("Error in input, unable to parse '" + input + "'.");
            }
          }
        }
    
        enum State
        {
          Happy,
          Sad,
          Unknown
        }
    
        static void CalcHappyNumbers (uint upper_bound)
        {
          SortedDictionary
            happy = new SortedDictionary ();
    
          SortedDictionary
            happy_numbers = new SortedDictionary ();
    
          happy [1] = State.Happy;
          happy_numbers [1] = true;
    
          for (uint current = 2 ; current < upper_bound ; ++current)
          {
            FindState (ref happy, ref happy_numbers, current);
          }
    
          //foreach (KeyValuePair pair in happy_numbers)
          //{
          //  Console.Write (pair.Key.ToString () + ", ");
          //}
    
          //Console.WriteLine ("");
        }
    
        static State FindState (ref SortedDictionary happy, ref SortedDictionary happy_numbers, uint value)
        {
          State
            current_state;
    
          if (happy.TryGetValue (value, out current_state))
          {
            if (current_state == State.Unknown)
            {
              happy [value] = State.Sad;
            }
          }
          else
          {
            happy [value] = current_state = State.Unknown;
    
            uint
              new_value = 0;
    
            for (uint i = value ; i != 0 ; i /= 10)
            {
              uint
                lsd = i % 10;
    
              new_value += lsd * lsd;
            }
    
            if (new_value == 1)
            {
              current_state = State.Happy;
            }
            else
            {
              current_state = FindState (ref happy, ref happy_numbers, new_value);
            }
    
            if (current_state == State.Happy)
            {
              happy_numbers [value] = true;
            }
    
            happy [value] = current_state;
          }
    
          return current_state;
        }
      }
    }
    

    I compared it against Dr_Asik's C++ code. For an upper bound of 100000 the C++ version ran in about 2.9 seconds and the C# version in 0.35 seconds. Both were compiled using Dev Studio 2005 using default release build options and both were executed from a command prompt.

提交回复
热议问题