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? 

[code] #!/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]) [/code]

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

marmeladze (2014-12-01 20:54:38)
12-ci sətirdəki isperfect-lər isPerfect kimi olacaq.

marmeladze (2014-12-01 20:26:19)
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. [code] 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) [/code]

VendeTTA (2013-05-09 11:56:14)
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. [code]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)[/code] 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.

marmeladze (2013-05-09 01:56:43)
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.

VendeTTA (2013-05-08 14:49:06)
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ə: [code]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[/code] 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ə.

Mövzu üzrə bənzər suallara da baxa bilərsiniz.

Kompyuterin RAM-ı

Notbuku satmaq istəyirəm

RAM Seçmək

qara ekranda nə deyilir

Ram haqqında 2 sual.

Komputer rami haqqinda