Ostrzeganie przed optymalizacją: nie należy wstępnie optymalizować. Za każdym razem, gdy próbujesz zoptymalizować kod, profiluj go, aby zapewnić jego optymalizację, i zoptymalizuj profil optymalizacyjny dla tego samego rodzaju danych, które zamierzasz zoptymalizować, aby potwierdzić, że jest to przyspieszenie. Prawie cały kod nie wymaga optymalizacji, aby podać poprawną odpowiedź.
Jeśli optymalizacji dla małych X Y i duży a-b:
utworzyć tablicę o długości, która jest najmniejsza wspólna wielokrotność spośród wszystkich x, x + 1, x + 2 ... y. Na przykład dla 2, 3, 4, 5 będzie to 60, a nie 120.
Teraz wypełnij tę tablicę bajtami - na początku false dla każdej komórki, następnie dla każdej liczby w xy zapełnij wszystkie wpisy w tablicy, są wielokrotnościami tej liczby z wartością true.
Teraz dla każdej liczby w a-b, indeksuj do tablicy długości modulo i jeśli jest to prawda, pomiń jeszcze, jeśli jest to fałsz, zwróć.
Możesz zrobić to trochę szybciej, usuwając z ciebie liczby czynników x do y, które są rozszerzonymi czynnikami pierwszeństwa o ścisłe nadzbiory z dodatkami innych czynników o priorytetach. Przez co mam na myśli - jeśli masz 2, 3, 4, 5, 4 to 2 * 2 ścisły nadzbiór 2, więc możesz go usunąć, a teraz nasza długość tablicy wynosi tylko 30. Dla czegoś takiego jak 3, 4, 5, 6 jednak 4 to 2 * 2, a 6 to 3 * 2 - 6 to nadzbiór 3, więc go usuwamy, ale 4 nie jest nadzbiorem wszystkiego, więc trzymamy go. LCM to 3 * 2 * 2 * 5 = 60 Robiąc takie rzeczy przyspieszałoby samo w sobie dla dużych ab i nie musisz iść w kierunku tablicy, jeśli to wszystko, czego potrzebujesz.
Pamiętaj też, że jeśli nie zamierzasz używać całego wyniku funkcji za każdym razem - np. Być może interesujesz się tylko najniższą wartością - zapisz ją jako generator, a nie jako funkcja. W ten sposób możesz zadzwonić, dopóki nie masz wystarczającej liczby, a następnie przestać, oszczędzając czas.
Czy optymalizujesz dla dużych (b-a), dużych b, dużych (y-x), dużych y lub dla wywoływania go wiele razy z małymi liczbami? Podejrzewam, że odpowiedź będzie się różnić w zależności od tych pytań. – Patashu
To jest część problemu: a, b, x, y, rośnie stopniowo – JohnWO
Czy nie chcesz napisać 1e100 zamiast "1, e + 100"? W takim przypadku trudno będzie znaleźć bardzo szybką metodę, ponieważ zbiór liczb nie mieści się w pamięci, a nawet na dysku twardym (zdecydowanie). Jeśli liczba jest rozsądna (powiedzmy, że 1e8, aby zmieściły się w pamięci), szybkie podejście można uzyskać, handlując pamięcią w celu uzyskania prędkości. – EOL