Másvalaki problémája... Kígyó...

Kapkodtam egy kicsit Linux-on, AIX-on, nem tudtam reprodukálni (bár nagyjából látom, hol kellene debuggolni, ha fellépne a hiba (dtoa.c:_Py_dg_dtoa, strtod.c:strod, etc))

Amit mégis felpanaszolni szeretnék, az csak annyi, hogy gondoltam, nyomok egy nagyobb tesztet, hátha mégis elő tudom idézni a hibát (csak más számoknál). Na ez lett:


cat nums.py
#!/usr/local/bin/python
for x in range(123000000000,123459999999):
    print '{0:.10f}'.format(x)
$ ./nums.py | grep ':'
Traceback (most recent call last):
  File "./nums.py", line 2, in <module>
    for x in range(123000000000,123459999999):
MemoryError

Ezt a dolgot egyébként úgy hívják Ifjabb Hátulgombolós Istvánéknál, hogy a hagyományos for-ciklust sikerült meghaladni. Hát igen. Sikerült. Köszi!

Hozzászólások

Nem védeni akarom a Python-t, de nézd meg a dokumentációban a range() és az xrange() közötti különbséget.
Illetve a 3-as Pythonban a range() úgy viselkedik, mint a 2-esben az xrange().

Köszi, ez hasznos információ!

Félek, hogy nem tudom reprodukálni a problémát, anélkül viszont nincs hangulatom nyomozni... Ilyesmi részek vannak a kódban:


            if (i == ilim) {
                dval(&u) += dval(&u);
                if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
                  bump_up:
                    while(*--s == '9')
                        if (s == s0) {
                            k++;
                            *s = '0';
                            break;
                        }
                    ++*s++;
                }
                break;
            }

Igen. Valoszinuleg a `range(123000000000,123459999999)` lepeldanyosit egy 0.46giga elemszamu (tehat valtozomerettol fuggoen 3.7-7.4 gigabytenyi memoriaigenyu) tombot, es azt szepen vegigitarealja. Es az azert nem annyira keves memoria, szoval egy MemoryError siman befigyelhet.

De mindenkepp ilyen ehhez hasonlo range-s megoldast keress mert a for (x=123000000000; x<=123459999999; x++) jellegu megoldasok untrendyk, elavultak, nem pythonosak es kulonbenis fujfujj!!!!1111oneone!!!

Pontosan úgy van, ahogy mondod, ezt a dokumentáció le is írja.
https://docs.python.org/release/2.7.9/library/functions.html?highlight=…
"The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]."
Azaz ténylegesen el is készíti a range() a listát.

És xrange-t kell használni:

"This function is very similar to range(), but returns an xrange object instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously."

De persze a doksit el kell olvasni.

Off: Annyira jellemző ez a Pistikék agyműködésére: ha már elkövették a hibát (a hagyományos for helyett a range-es for-t), azt nem hajlandók javítani, inkább újabb tákolással próbálják megkerülni a hibás döntés okozta gondot... (Most nem akarom Strupstrup és Pöttering urakat felemlíteni, mint ennek a mentalitásnak az iskolapáldáit.)