kompüterdə yaddaş problemi

salam. kompüterdə kiçik miqyaslı riyazi hesablamalar aparan zaman yaddaşda, məlumatın emalında olduqca böyük problemlər yaşanır – məsələn adicə ilk 10 min sadə ədədi hesablamaq üçün skript yazanda, kompüterin cavabı olduqca gecikir bəzən isə timeout yaxud, out of memory yazır.  burda aydındır ki, iki problem ola bilər – ya kodlaşdırma həddən artıq qaba aparılır ya da ki, sadəcə olaraq kompüter resursları yetərsizdir. ikincinin həlli üçün kompüteri təzələmək yaxud təzə ram, prosessor quraşdırmaq lazımdır ki bunu hələlik iqnor edirəm. əsasən ilk problemin həllinə fokuslanmaq istəyirəm. kodlaşdırma zamanı kompüterin resurslarını da nəzərə alan adekvat həll kimi təcrübəli proqramçılar nələri təklif edirlər? 

məsələn aşağıdakı skripti necə daha optimal hala gətirə bilərəm? 

#!/usr/bin/python
##eulerproject 02/05/13 No 4

sade = [] 
a = 1      
while len(sade)<10002:
    a += 1
    for s in sade:
        if a % s == 0:
            break
    else:
        sade.append(a)
        
##print (sade)
##print (sade[10001])

Yadda saxlama
Kateqoriya: Sual . , , . Qısa keçid.

Verilmiş cavablar və yazılan şərhlər (5 cavab var)

(14:49, 08/05/2013 ) #29740

Salam. Düzdür təcrübəli proqramçı deyiləm bu dil üzrə, sadəcə maraqlanıram php-dən başım açılan kimi:)
Python ən ağır işləyən dillərdən olsa da, kompüter resurslarını məhv edəcək qədər deyil. Yuxarıda yazılan kodda sadə ədəd düzgün təyin olunmur, ona görə də nəyinki 10000, heç 100-ə kimi olanları da göstərmir.
Nümunə:

def sade(a): ## Sade ededlerin tapilmasi
    if a == 1:
        return
    for s in range(2, a):
        if a % s == 0:
            return
    else:
        return 1
  
array = []
a = 0
n = 1000
while a<n:
   a += 1 
   if sade(a):  
     array.append(a)
   
   
print array

10000-ə kimi ədədləri təxminən 4-5 saniyəyə tapır. Amma üstünə düşsək bir az da mükəmməlləşdirmək olar məncə.

Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

    (01:56, 09/05/2013 ) #29772

    salam V -))
    düzgün təyin olunmayıb? niyə ki?
    mən yuxarıda yazdığım kodda, ilk n qədər sadə ədədi tapmağa çalışıram, (ilk n ədədə qədərki sadə ədədləri yox) və müəyyən bir həddə qədər də tapılır. burda ilk üç min var.
    while len(sade) < x – ifadəsinə diqqət edin: sadə ədədlərin daxil olduğu listdəki ədədlərin sayı x-dən kiçik olana qədər. ki, bunu yuxarıda da yazmışdım – "ilk 10 min sadə ədədi hesablamaq".

    amma orda 3000 yerinə 5000 yazsanız, artıq codepad interpreteri, timeout cavabı verəcək. mənə isə məhz müəyyən bir həddə qədər, bu tip hesablamaları apara bilməyin optimal variantı lazımdır.

    yollardan biri əlbəttə ki, alqoritmi riyazi əsaslarla daha optimal variantda yazmaqdır. məsələn yuxarıdakı məsələdə, ikimizin və çox adamın elədiyi "səhv" kimi, sadəliyi təyin etmək üçün, seçilən ədədi özündən əvvəlki bütün sadə ədədlərə bölmək yox, həmin ədədin kvadratkökünün təqribi dəyərinə qədər olan sadə ədədlərə bölməkdir. bu təxminən ikiqat sürət verəcək. amma bu sadəcə bu məsələyə aid spesifiklikdir.
    kodlaşdırmanın özünə müncər edilə biləcək hansısa "qənaət metodları" varmı? bunu sırf python üçün demirəm – ümumi bir məsələ kimi soruşuram.

    Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

      (11:56, 09/05/2013 ) #29781

      Hə, deyəsən sualı səhv anlamışdım) Onda bir balaca da sürət əldə etmək üçün hər dəfə massivi saymamaq lazımdır. Belə etmək olar. Xeyli sürət fərqi əldə olunacaq, resurs da az işlənəcək.

      sade = [] 
      a = 1 
      sadenums = 0 ## cache edirik
      while sadenums<10000:
          a += 1
          for s in sade:
              if a % s == 0:
                  break
          else:
              sade.append(a)
              sadenums +=1
              
      print (sade)

      Qısası burda resursu sökən massivin sayılmasıdır dövr hər dəfə işə düşdükcə. Əgər kifayət etməsə yenə nəsə düşünmək olar.

      Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(20:26, 01/12/2014 ) #50007

mövzu yenə aktualdı. məsələ budu – sonuncu həddi 4 milyonu keçməmək şərtilə cüt fibonaççi ədədlərinin cəmini tapın.

verilən n ədədinin fibonaççi ədədi olub-olmadığı belə yoxlanılır: (5n^2+4), yaxud (5n^2-4) ifadələrindən ən az biri tam kvadratdırsa n fibonaççi ardıcıllığının üzvüdü.

həlli ola biləcək ən sadə formada yazıram – sırf iterasiya hissəsinə fokuslanmaq üçün.

import math

def isPerfect(x):

    c = math.sqrt(x)
    if c*c == x: return True
    else: return False

def isFibo(x):

    t = 5*x*x
    if isperfect(t+4) or isperfect(t-4): return True
    else: return False

def isEven(x):

    if x%2 == 0: return True
    else: return False

evenFibos = [x for x in range(4000000) if isFibo(x) and isEven(x)]

print sum(evenFibos)
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

    (20:54, 01/12/2014 ) #50008

    12-ci sətirdəki isperfect-lər isPerfect kimi olacaq.

    Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

Bu suala aid öz sualım var:
Sual verin
Bu suala cavab vermək istəyirəm:
Cavab verin

Cavab verin


Cavab yazmaq üçün lütfən sağ sütundan və ya buradan hesaba daxil olun.

Üzvlər üçün giriş

Qeydiyyat

Elan qutusu

Son cavablar və şərhlər

Software Developer cavab verdi - Payoneer kartdan pul çıxartdıqda vergi (23 saat əvvəl)

Software Developer cavab verdi - Wise vasitəsilə bank kartına pul köçürmə (4 gün əvvəl)

Software Developer cavab verdi - Rus dilindən mətni tərcümə etmək (5 gün əvvəl)

Cənab cavab verdi - Almanca söz bazası yığmaq (8 gün əvvəl)

rdrobert cavab verdi - Mikrofon süngərinə yazı (9 gün əvvəl)

rdrobert cavab verdi - Yerli virtual olaraq dost tapmaq platforması (9 gün əvvəl)

rdrobert cavab verdi - Almanca söz bazası yığmaq (9 gün əvvəl)

rdrobert cavab verdi - Playstation 4 almaq, Playsation klub açmaq (9 gün əvvəl)

rdrobert cavab verdi - Proqramistin ixtsasi hansidir? (9 gün əvvəl)

Software Developer cavab verdi - Azercell Kabinetim aplikasiyasında İstəSən tarifi haqqında (10 gün əvvəl)

Software Developer cavab verdi - Proqramistin ixtsasi hansidir? (11 gün əvvəl)

byshako cavab verdi - Google Azərbaycan nömrələrini qəbul etmir (21 gün əvvəl)

rdrobert cavab verdi - Honeygain, passiv gelir (22 gün əvvəl)

rdrobert cavab verdi - Xaricdən telefon getirmek (22 gün əvvəl)

rdrobert cavab verdi - Google Azərbaycan nömrələrini qəbul etmir (22 gün əvvəl)

Software Developer - 615 xal

E. Hacı - 607 xal

Onar Alili - 526 xal

Dilsuz - 448 xal

Cabbarov Sübhan - 434 xal

Maqa - 346 xal

Ruslan Butdayev - 328 xal

Namiq Bəndəli - 297 xal

U.Tarlan - 244 xal

Meherremoff - 234 xal

Sistemə daxil olmuş 23236 sualdan 92%-dən çoxu cavablandırılmışdır.

Proyekt haqqında

E-Haci.net istehsalı. © 2010-2024