Jestem nowa dla Julii. Programuję głównie w Pythonie.Próba znalezienia sposobu na skonstruowanie Julii `generator`
W python, jeśli chcesz iterować na dużym zestawie wartości, , typowe jest skonstruowanie tak zwanego generatora, aby zaoszczędzić zużycie pamięci. Oto jeden przykład kodu:
def generator(N):
for i in range(N):
yield i
Zastanawiam się, czy jest coś zarówno w Julii. Po przeczytaniu podręcznika julia, @task makro wydaje się mieć tę samą (lub podobną) funkcjonalność co generator w pythonie. Jednak po niektórych eksperymentach, użycie pamięci wydaje się być większe niż zwykle w julia.
Używam @time
w IJulia, aby zobaczyć użycie pamięci. Oto mój przykładowy kod:
[Aktualizacja]: Dodaj kod generator
metody
(Metoda generator
)
function generator(N::Int)
for i in 1:N
produce(i)
end
end
(wersja generatora)
function fun_gener()
sum = 0
g = @task generator(100000)
for i in g
sum += i
end
sum
end
@time fun_gener()
upłynął czas: 0,420731828 sekund (przydzielono 6507600 bajtów)
(wersja array)
function fun_arry()
sum = 0
c = [1:100000]
for i in c
sum += i
end
sum
end
@time fun_arry()
upłynął czas: 0.000629629 sekund (800144 bajtów przydzielone)
Czy ktoś może mi powiedzieć, dlaczego @task
będzie wymagać więcej miejsca w tym przypadku? A jeśli chcę zaoszczędzić zużycie pamięci jako zajmującej się dużym zestawem wartości, co mogę zrobić?
Nicea. Przepraszam, że zapomniałem opublikować mój kod dla metody generatora. Jest dokładnie taki sam jak twój. Dzięki za odpowiedź. – DboyLiao
@DboyLiao nie ma problemu, myślę, że jest to przydatne pytanie, aby mieć tutaj! –
Ale nadal jestem ciekawy, jak działa "@ task" i dlaczego zajmuje dużo więcej miejsca i jest jeszcze gorszy? Może to odkryję, kiedy zagłębię się w Julię. Z radością widzę, że Julia już wzięła pod uwagę problem z pamięcią i dostarcza nam ładny obiekt z zasięgiem. – DboyLiao