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!
- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
- 1186 megtekintés
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().
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
IOCCC bíráló is vagy?
- A hozzászóláshoz be kell jelentkezni
Nem is hallottam róla. De például ezt a 600-soros _Py_dg_dtoa függvényt biztos egy remek koder csinálta, az egy/két betűs változónevekkel, a goto-kkal egy blokk belsejébe, az egész átláthatatlan kavarással...
- A hozzászóláshoz be kell jelentkezni
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!!!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
Tovább néznéd rant helyett, python3-ban neked tetszően van.
- A hozzászóláshoz be kell jelentkezni
Úgy érted, hogy
for exp1; exp2; exp3: statement
?
Ez jó hír, csak az aktuális gond a Python-ban van, nem a Python3-ban. (Nem is értem, az emberek miért nem tüzesebbek az inkompatibilis verzióváltásokért...)
- A hozzászóláshoz be kell jelentkezni
Nem, a range vette fel az xrange működését.
A probléma fennáll, valódi, de ekkora hisztit nem kéne érdemelnie (van nagyobb baj is, pl. a ctypesnál), aki egyszer erre ráfut, az már tudni fogja.
- A hozzászóláshoz be kell jelentkezni
Ismeros ez nekem valahonnan...
- A hozzászóláshoz be kell jelentkezni