Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2013 13:00:05

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

 for i in xrange(1, 600851475141):
   if 600851475141 % i == 0:
     print i

Да и вопрос интересует - почему, после некоторого момента, он наглухо виснет?
Тогда как отдельное взятие деления по модулю даже больших чисел занимает миллисекунды,
а перебор в цикле через итератор тоже вроде не ахти какая по сложности задача.



Отредактировано ks (Март 6, 2013 14:18:14)

Офлайн

#2 Март 7, 2013 12:29:05

pnk.andrian
От:
Зарегистрирован: 2011-01-30
Сообщения: 6
Репутация: +  1  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

А вы серьезно считаете, что цикл из 600 милиардов итераций должен работать быстро?
Оптимизировать тут можно многое, например получить факторизацию числа и по ней составить список делителей. Но в вашем случае достаточно итерировать до квадратного корня по нечетным числам.



Офлайн

#3 Март 7, 2013 21:16:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

>>> import sympy.ntheory.primetest as pt 
>>> pt.isprime(600851475141)
False
Этот код несколько короче и несколько быстрее.
http://docs.sympy.org/dev/_modules/sympy/ntheory/primetest.html



Отредактировано doza_and (Март 7, 2013 21:16:46)

Офлайн

#4 Март 7, 2013 21:23:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

ks
после некоторого момента, он наглухо виснет?
>>> dt=1e-3;(600851475141*dt)/(3600*24*365)
19.05287528985921
Немного подождите.



Офлайн

#5 Март 7, 2013 22:43:00

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

Уберите print



Офлайн

#6 Март 8, 2013 04:11:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

pnk.andrian
Но в вашем случае достаточно итерировать до квадратного корня по нечетным числам.
а кто сказал, что это вывод всех простых чисел ?
разделить на два можно верхнюю границу

Isem
Уберите print
print там вообще очень редко происходит



Офлайн

#7 Март 11, 2013 08:49:06

pnk.andrian
От:
Зарегистрирован: 2011-01-30
Сообщения: 6
Репутация: +  1  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

py.user.next
а кто сказал, что это вывод всех простых чисел ?
разделить на два можно верхнюю границу
А при чем здесь простые числа?
A*B = N
A < N**0.5 => B > N**0.5



Офлайн

#8 Март 11, 2013 10:41:52

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

ks
Да и вопрос интересует - почему, после некоторого момента, он наглухо виснет?
Код виснет потому, что 600851475141 = 3*11981*16716787
и у этого числа нет делителей, больших 16716787.
Перебрать же 600851475141-16716787=600834758354 чисел на питоне нереально.

p.s. Имеется в виду простых делителей.
Ближайшие два делителя после 16716787 - это 50150361 и 200283825047.



Отредактировано Isem (Март 11, 2013 10:47:13)

Офлайн

#9 Март 11, 2013 16:07:23

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

pnk.andrian
получить факторизацию числа и по ней составить список делителей
Это как (сам процесс факторизации числа - при чем он здесь, не понятен)?

pnk.andrian
А вы серьезно считаете, что цикл из 600 милиардов итераций должен работать быстро?
.))))) Ну подумаешь - не заметил порядок цифр.. я думал вполне реально и вот такое число перебрать: 100000000000000000000000000000000000 - ошибался.



Офлайн

#10 Март 11, 2013 16:07:59

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить выполнение скрипта?

doza_and
>>> dt=1e-3;(600851475141*dt)/(3600*24*365)
19.05287528985921
Немного подождите.

Что вы посчитали?



Отредактировано ks (Март 11, 2013 16:08:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version