Results 1 to 4 of 4

Thread: Скорость python

  1. #1
    Join Date
    Nov 2008
    Location
    Germany
    Posts
    963

    Default Скорость python

    Всем привет

    Не смотря на все свои плюсы python, все же он уступает C++ ...например в скорости.
    Конечно, за счет оптимизации кода разницу можно сократить до минимума, но все же...
    Вот пример программы, которая идет по всем числам от 1 до 10000000, и показывает совершенные числа и highly_composite числа (не знаю как по-русски). Много времени оптимизации не уделял, но даже несмотря на то,что код получился короче, работает python-программа на много медленнее.

    Если есть python-программисты, помогите ускорить выполнение python-кода. Возможно для этой задачи подойдет другой алгоритм?

    Код на python:
    Code:
    #!/usr/bin/python
    
    c=0
    print "1\t is highly composite number"
    
    for i in range(1, 1000001):
            divisors=0
            a=0 
            for j in range(1,i):
                    b=0 
                    if i%j == 0:
                            a=a+1
                            divisors+=j
        
            if i==divisors:
                    print i, "\t is perfect number" 
                    b=1 
        
            if a>c:
                    c=a 
                    if b == 1:
                            print "\t and also highly composite number"
                    else:
                            print i, "\t is highly composite number"
    Код на С++:
    Code:
    #include <iostream>
    using namespace std;
    
    unsigned long i, j; //type for 10 000 000
    
    int a=0, c=0, divisors;
    bool b=false; //for both numbers
    
    int main(int argc, char* argv[])
    {
    cout << "1\t is highly composite number" << endl;
            for (i=1; i<=10000000; i++)
            {
                    divisors=0;
                    a=0;
                    for (j=1; j<i; j++)
                            if (i%j==0)
                            {
                                    a++; //how many divisors has every number
                                    divisors+=j;
                            }
    
                    if (i==divisors) //ok, it looks like "perfect number" (http://en.wikipedia.org/wiki/Perfect_number)
                    {
                            cout << i << "\t is perfect number" << endl;
                            b=true;
                    }
    
                    if(a>c) //ok, it looks like "highly composite number" (http://en.wikipedia.org/wiki/Highly_composite_number)
                    {
                            c=a;
                            if(b) //if both (perfect AND highly composite number)
                                    cout << "\t and also highly composite number " << endl;
    
                            else//if highly composite number ONLY
                                    cout << i << "\t is highly composite number" << endl;
    
                    }
                    b=false;
            }
    return 0;
    }
    С уважением,
    Alex

  2. #2

    Default Re: Скорость python

    небольшая оптимизация твоего алгоритма повысит скорость примерно от 15 до 20 %
    Code:
     print "1\t is highly composite number"
        t1, t2, t3, c = "\t and also highly composite number", "\t is highly composite number", "\t is perfect number", 0
        
        for i in xrange(1, 10001):
            a = divisors = b = 0
            
            for j in xrange(1,i):
                if i%j == 0:
                    a+=1
                    divisors+=j
        
            if i==divisors:
                print i, t3
                b=1 
        
            if a>c:
                c=a 
                print "%s" % t1 if b==1 else "%s%s" % (i, t2)
    на будущее, использовать лучше xrange, в данном случаи дает прибавку скорости в 7-10 %

  3. #3

    Default Re: Скорость python

    Вот еще один момент оптимизации, второй цикл можно сократить в половину, скорость от этого конечно же значительно вырастает =)
    Code:
     print "1\t is highly composite number"
        t1, t2, t3, c = "\t and also highly composite number", "\t is highly composite number", "\t is perfect number", 0
        
        for i in xrange(1, 10001):
            a = divisors = b = 0
            
            for j in xrange(1,i/2 + 1):
                if i%j == 0:
                    a+=1
                    divisors+=j
        
            if i==divisors:
                print i, t3
                b=1 
        
            if a>c:
                c=a 
                print "%s" % t1 if b==1 else "%s%s" % (i, t2)

  4. #4
    Join Date
    Nov 2008
    Location
    Germany
    Posts
    963

    Default Re: Скорость python

    Quote Originally Posted by zladey View Post
    Code:
     print "1\t is highly composite number"
        t1, t2, t3, c = "\t and also highly composite number", "\t is highly composite number", "\t is perfect number", 0
        
        for i in xrange(1, 10001):
            a = divisors = b = 0
            
            for j in xrange(1,i/2 + 1):
                if i%j == 0:
                    a+=1
                    divisors+=j
        
            if i==divisors:
                print i, t3
                b=1 
        
            if a>c:
                c=a 
                print "%s" % t1 if b==1 else "%s%s" % (i, t2)
    Очень красивый код, спасибо!

    p.s.
    Кстати, я создал группу в коннекте. Буду рад там всем python программистам.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •