Re: [Python] Iterare in una lista.
Ritiro tutto: per liste grosse il costo di calcolare (in python) a ogni iterazione `(i + base) % len` è molto maggiore del costo di creare una sola volta all'inizio la nuova lista: In python3.8: >>> import timeit >>> setup = """def function1(lista, base): ... s = 0 ... for e in lista[base:]+lista[:base]: ... s += e ... return s ... ... def function2(lista, base): ... s = 0 ... l = len(lista) ... for i in range(l): ... s += lista[(i + base) % l] ... return s ... ... lista = list(range(10**6)) ... base = 424_242 ... """ >>> timeit.timeit("function1(lista, base)", setup=setup, number=500) 33.3623988628 >>> timeit.timeit("function2(lista, base)", setup=setup, number=500) 66.6768571770001 In pypy3 7.3.0 timeit.timeit("function1(lista, base)", setup=setup, number=500) 3.72352198076 timeit.timeit("function2(lista, base)", setup=setup, number=500) 9.05015236352 ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Se k<=n, O(n+k) <= O(2n) che è == O(n) In particolare il tempo necessario a stampare tutti gli elementi con print (o a farci qualsiasi cosa di non estremamente banale) sarà molto maggiore del tempo necessario a creare la nuova lista. Mi aspetterei anch'io che la soluzione di cm sia più efficiente per liste molto grosse (e usi meno memoria). Ma nel 99% dei casi mi sa che la stragrande maggioranza del tempo si passa dentro il for, e le differenze misurate non siano davvero significative On Mon, Feb 17, 2020, 08:45 Pietro Brunetti wrote: > >> Le differenze non sono sostanziali, ma la prima è leggermente più >> efficiente >> > > Ciao a tutti, > trovo l'approccio di cm formalmente corretto "iterate lungo una lista" e > non "create una lista". > > Per cm O(n) per l'altra funzione O(n+k), perché non solo itera ma anche > estende. > > Basta dare una occhiata a questo, poi > > https://wiki.python.org/moin/TimeComplexity > > Adesso, il timeit mi contraddice. C'è qualche ottimizzazione dietro? Ho > ragionato male? Bisogna provare con liste più "enormi"? Non so. > > Ciauz > Pietro > >> ___ > Python mailing list > Python@lists.python.it > https://lists.python.it/mailman/listinfo/python > ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
> > > Le differenze non sono sostanziali, ma la prima è leggermente più > efficiente > Ciao a tutti, trovo l'approccio di cm formalmente corretto "iterate lungo una lista" e non "create una lista". Per cm O(n) per l'altra funzione O(n+k), perché non solo itera ma anche estende. Basta dare una occhiata a questo, poi https://wiki.python.org/moin/TimeComplexity Adesso, il timeit mi contraddice. C'è qualche ottimizzazione dietro? Ho ragionato male? Bisogna provare con liste più "enormi"? Non so. Ciauz Pietro > ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Ciao DanZa Il giorno dom 16 feb 2020 alle ore 19:27 Daniele Zambelli ha scritto: > > Ho confrontato le due funzioni: > > numel = 12 > lista = [i * 11 for i in range(numel)] > base = 5 > > def function1(lista, base): > for e in lista[base:]+lista[:base]: > print(e) > > def function2(lista, base): > for i in range(len(lista)): > print(lista[(i + base) % len(lista)]) > > function1(lista, base) > function2(lista, base) > > Qualcuno di esperti saprebbe indicare le caratteristiche dei due > approcci in termini di risorse e di tempi? Le differenze non sono sostanziali, ma la prima è leggermente più efficiente ``` >>> def print(*args): ... >>> timeit function1(lista, base) 1.57 µs ± 27.3 ns per loop (mean ± std. dev. of 7 runs, 100 loops each) >>> timeit function2(lista, base) 2.48 µs ± 37.7 ns per loop (mean ± std. dev. of 7 runs, 10 loops each) >>> timeit function1(lista, base) 1.55 µs ± 8.63 ns per loop (mean ± std. dev. of 7 runs, 100 loops each) >>> timeit function2(lista, base) 2.45 µs ± 12 ns per loop (mean ± std. dev. of 7 runs, 10 loops each) ``` ㎝ -- THE -WARE LICENSE (Revision ㊷): <㎝.> wrote this . As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a in return. — ㎝ ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Di passaggio: se non l'hai capita era perché evidentemente sono stato poco chiaro nei commenti. In effetti quella classe fa parecchie cose anche complicate. Per lumi sono sempre disponibile, meglio se in privato così non si da fastidio a nessuno. E, magari, se mi fai delle domande, posso migliorarne la documentazione. Bye! Ale ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Il giorno dom 16 feb 2020 alle ore 20:05 alessandro medici ha scritto: > [...] > L'uso è piuttosto semplice, supponendo tu abbia una lista: > > lista = [0,1,2,3,4,5,6,7,8,9] > lista = Repslicing(lista) > > a questo punto puoi iterare la nuova lista anche con gli indici necessari a > te: > > lista = lista[5:5] > [...] Non capisco il senso del secondo numero dello slicing. Ciao -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Il dom 16 feb 2020, 19:27 Daniele Zambelli ha scritto: > Il giorno sab 15 feb 2020 alle ore 20:04 alessandro medici > ha scritto: > > > > > > Oggi è sabato. La cosa mi ha divertito ed ho pensato che valesse la pena > generalizzare il problema: > > > > > https://github.com/AlessandroMedici/add_a_mood_for_slice/blob/master/RepSlip.py > > Interessante... ma non l'ho capita > > :) > Il giorno gio 13 feb 2020 alle ore 16:23 Gabriele Battaglia < iz4...@libero.it> ha scritto: > Buona sera. > Se ho una lista che contiene 10 elementi e voglio scrivere un ciclo che > itera dall'elemento 5, arriva alla fine e riprende finendo al 4. > A parte gestire autonomamente l'indice con un algoritmo, esiste una > funzione già presente in Python per farlo? > Gabry No, in effetti. La cosa però mi aveva incuriosito abbastanza perché l'idea mi potrebbe esser utile, se più generalizzata. Non solo alle liste, quindi. L'uso è piuttosto semplice, supponendo tu abbia una lista: lista = [0,1,2,3,4,5,6,7,8,9] lista = Repslicing(lista) a questo punto puoi iterare la nuova lista anche con gli indici necessari a te: lista = lista[5:5] in lista troverai: lista [5,6,7,8,9,0,1,2,3,4] p.s. stamane ho sistemato anche un paio di bug e spero anche di aver corretto l'inglese da sabato sera :))) p.p.s. la parte relativa agli indici negativi ed a step puo' essere bellamente ignorata. Ale. ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Il giorno sab 15 feb 2020 alle ore 20:04 alessandro medici ha scritto: > > > Oggi è sabato. La cosa mi ha divertito ed ho pensato che valesse la pena > generalizzare il problema: > > https://github.com/AlessandroMedici/add_a_mood_for_slice/blob/master/RepSlip.py Interessante... ma non l'ho capita Ho confrontato le due funzioni: numel = 12 lista = [i * 11 for i in range(numel)] base = 5 def function1(lista, base): for e in lista[base:]+lista[:base]: print(e) def function2(lista, base): for i in range(len(lista)): print(lista[(i + base) % len(lista)]) function1(lista, base) function2(lista, base) Qualcuno di esperti saprebbe indicare le caratteristiche dei due approcci in termini di risorse e di tempi? Ciao. -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Oggi è sabato. La cosa mi ha divertito ed ho pensato che valesse la pena generalizzare il problema: https://github.com/AlessandroMedici/add_a_mood_for_slice/blob/master/RepSlip.py ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Il giorno gio 13 feb 2020 alle ore 16:23 Gabriele Battaglia ha scritto: > > Buona sera. > Se ho una lista che contiene 10 elementi e voglio scrivere un ciclo che > itera dall'elemento 5, arriva alla fine e riprende finendo al 4. > A parte gestire autonomamente l'indice con un algoritmo, esiste una > funzione già presente in Python per farlo? Un'altra possibilità: numel = 12 lista = [i * 11 for i in range(numel)] base = 5 for e in lista[base:]+lista[:base]: print(e) -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Iterare in una lista.
Il giorno gio 13 feb 2020 alle ore 16:23 Gabriele Battaglia ha scritto: > > Buona sera. > Se ho una lista che contiene 10 elementi e voglio scrivere un ciclo che > itera dall'elemento 5, arriva alla fine e riprende finendo al 4. > A parte gestire autonomamente l'indice con un algoritmo, esiste una > funzione già presente in Python per farlo? > Gabry Nulla di già presente, ma puoi fare qualcosa tipo ``` >>> l = [i * 11 for i in range(10)] >>> l [0, 11, 22, 33, 44, 55, 66, 77, 88, 99] >>> for i in range(len(l)): ... print(l[(i + 5) % len(l)]) ... 55 66 77 88 99 0 11 22 33 44 ``` Ciao, ㎝ -- THE -WARE LICENSE (Revision ㊷): wrote this . As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a in return. — Carlo ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
[Python] Iterare in una lista.
Buona sera. Se ho una lista che contiene 10 elementi e voglio scrivere un ciclo che itera dall'elemento 5, arriva alla fine e riprende finendo al 4. A parte gestire autonomamente l'indice con un algoritmo, esiste una funzione già presente in Python per farlo? Gabry -- Gabriele Battaglia, IZ4APU (Libero) Sent from TB on Windows 10, Genus Bononiae's computer. ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python