Seite 6 von 9

Verfasst: Donnerstag 8. Januar 2009, 17:25
von HerrHagen
Auf meinem WindowsXP System mit Python 2.5 kommt, wenn ich es direkt hintereinander ausführe immer die selbe Zahl raus. Es macht auch nichts wenn ich dazwischen viele Prozesse starte und Speicher beleg. Gerade hab ichs dann einfach nochmal probiert und es kam wieder ne neue Zahl.
Wäre mal interessant zu erfahren nach welchen System den Prozessen Speicher zugewiesen wird.

Verfasst: Donnerstag 8. Januar 2009, 18:24
von hendrikS
Vielleicht kann jemand bei Codesnippets mal ein Besipiel einstellen, wozu sich id() ueberhaupt sinnvoll einsetzen lässt. Hat bei meinen Anwendungen bisher nie eine Rolle gespielt.

Verfasst: Donnerstag 8. Januar 2009, 18:38
von str1442

Code: Alles auswählen

        new_positions = {}

        for member in self.members:
            position_to_check = member.position

            try:
            *snip*

            new_positions[id(member)] = new_position
           
            # Important checks that may lead to abort

        for member in self.members:
            new_position = new_positions[id(member)]
Aus meinen Tetris Klon Tetrix0r. id() liefert nur die Speicheradresse zurück, was man damit macht musst du entscheiden.

Verfasst: Donnerstag 8. Januar 2009, 18:46
von Trundle
`id()` liefert einfach eine Zahl, die eine Art Identität eines Objektes darstellen soll. Dass das die Speicheradresse ist, das ist lediglich ein Implementationsdetail.

Verfasst: Donnerstag 8. Januar 2009, 19:41
von BlackJack
@str1442: Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?

Speicherbelegung bei vielfachen von 2, 4, oder 16 passiert aus Optimierungsgründen. Viele Architekturen greifen langsamer auf Werte zu, wenn sie nicht an solchen Grenzen ausgerichtet sind. Einige SIMD-Maschinenbefehle auf x86-Prozessoren funktionieren nur mit Daten, die an 16-Byte-Grenzen ausgerichtet sind. Das `malloc()` aus der GNU Standardbibliothek liefert auf x86-Architekturen AFAIK auch immer nur Zeiger, die auf 16-Byte-Grenzen ausgerichtet sind.

Verfasst: Donnerstag 8. Januar 2009, 20:22
von jonas
Nabend
Ganz schön abgedriftet... :D
Ist der "dynastywarriors" hier überhaupt
noch in irgendeiner Form beteiligt :D ?
MfG Talas
PS: Nichtsdestotrotz ist die Diskussion
natürlich spannend^^

Verfasst: Donnerstag 8. Januar 2009, 20:48
von str1442
Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?
Nein. In der Doku hab ich unter __cmp__ grade nur gesehen, daß bei Nichtvorhandensein dieser Magischen Methoden über die Objekt Identität (also wohl mittels id()) eine Gleichheit zwischen Objekten definiert wird. Aber ich sehe nicht worauf du hinaus willst?

Danke für die Info! Aber wenn es sowieso meist virtueller Speicher ist, so wäre es doch quatsch nur jedes zweite virtuelle Byte zu benutzen, das widerspricht ja dann dem (vorhin nachgelesenem ^_^) Konzept von virtuellem Speicher, dem Programm einen ganzen "virtuellen" Block mit Speicher zu geben.

@jonas: Naja er hat auf seine Mutter geschworen jeden Tag hier mitzulesen ... ;)

Verfasst: Donnerstag 8. Januar 2009, 21:21
von BlackJack
@str1442: Wenn Du an `__cmp__()` und `__hash__()` nichts änderst, dann bezieht sich beides auf die Objektidentität, d.h. Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden. Also:

Code: Alles auswählen

new_positions[member] = new_position
Es wird ja nicht nur jedes zweite Byte benutzt, sondern nur die Anfänge von Werten die mehr als ein Byte belegen auf solchen Grenzen ausgerichtet. Technisch steckt dahinter, dass nicht einzelne Bytes adressiert werden, sondern grössere Einheiten. Und wenn ein Datenwort über solche Grenzen geht, müssen zwei Zugriffe gemacht werden. Die SIMD-Befehle, die Daten auf 16-Bytegrenzen erwarten, verarbeiten auch 16 Bytes auf einen Schlag.

Verfasst: Donnerstag 8. Januar 2009, 22:01
von numerix
Noch ein Nachtrag zum Thema "Zufallszahlen via id()":
Jython vergibt die IDs stets mit 1 beginnend mit fortlaufender Zählung.

Verfasst: Donnerstag 8. Januar 2009, 22:07
von derdon
Dann macht das Spiel mit dem Zahlen raten nicht mehr ganz so viel Spaß...

Verfasst: Donnerstag 8. Januar 2009, 22:15
von EyDu
Ich hab' jetzt nicht genau nachgeschaut ob schon eine vorliegt, aber sonst eine weitere Prolog-Lösung:

Code: Alles auswählen

zahl :- write('Ich habe eine Zahl zwischen 1 und 100.\n'), R is random(100)+1, raten(R).
raten(R) :- write('Rate: '), read(X), write('\n'), evaluate(R,X).
evaluate(R,X) :- R==X, write('Richtig\n'); (X<R, T='Zu klein\n'; T='Zu gross\n'), write(T), raten(R).

Verfasst: Freitag 9. Januar 2009, 11:50
von str1442
Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden.
Ja, gut, sofern man nichts an __cmp__, __hash__ oder den Rich Comparison Methoden ändert ist das Objekt als "immutable" einzustufen. Insofern benutze ich inzwischen solche einfachen Objekte auch direkt in Dictionaries als Keys, nur habe ich es in Tetrix0r nicht getan, und auch nicht dran gedacht, daß das möglich wäre. Da ich Tetrx0r bereits begonnen habe, als ich anfänglich Python gelernt habe, sieht der Quellcode sowieso an allen Ecken und Enden entsprechend aus, und es gäbe vieles, was ich inzwischen verbessern könnte, aber ich werde das Projekt wahrscheinlich ruhen lassen. Dennoch ist sowas eine mögliche Verwendung von id(), auch für "Mutable" Objekte, da man mit id() explizit nach Identität als nach Wert eine Dict Zuordnung aufbauen kann.

Verfasst: Samstag 10. Januar 2009, 02:00
von EyDu
Wie konnten nur Applescript vergessen werden.

Code: Alles auswählen

set zufallsZahl to random number from 1 to 100

set zahlErraten to false
repeat until zahlErraten is true
    set temp to display dialog "Eine Zahl zwischen 1 und 100. Rate: " default answer ""

    set eingabe to text returned of temp
    set x to eingabe as number

    if x is equal to zufallsZahl then
        display dialog "richtig" buttons {"OK"}
        set zahlErraten to true
    else if x ist less than zufallsZahl then
        display dialog "zu klein" buttons {"OK"}
    else
        display dialog "zu gross" buttons {"OK"}
    end if
end repeat

Verfasst: Samstag 10. Januar 2009, 10:11
von Darii
Ich bin immer wieder fasziniert, dass man mit AppleScript tatsächlich sowas wie Programmieren kann.

Verfasst: Samstag 10. Januar 2009, 15:10
von HWK
So, ich habe mich einmal gequält: Hier befindet sich eine Version in 16-Bit-X86-Assembler. Turbo-Assembler erzeugt hieraus eine COM-Datei (d.h. für DOS) mit einer Länge von 281 Bytes. Wer keinen Assembler installiert hat, kann die fertige COM-Datei mit diesem Python-Script erstellen.
MfG
HWK

Verfasst: Samstag 10. Januar 2009, 17:54
von hendrikS
HWK hat geschrieben:So, ich habe mich einmal gequält: Hier befindet sich eine Version in 16-Bit-X86-Assembler. Turbo-Assembler erzeugt hieraus eine COM-Datei (d.h. für DOS) mit einer Länge von 281 Bytes. Wer keinen Assembler installiert hat, kann die fertige COM-Datei mit diesem Python-Script erstellen.
MfG
HWK
Schade, daß Dein Code so mies kommentiert ist.

Verfasst: Samstag 10. Januar 2009, 19:16
von BlackJack
Wieso dass? Hat man die DOS-Aufrufe nicht im Kopf? :-)

Verfasst: Samstag 10. Januar 2009, 19:24
von hendrikS
Die Generierung von Zufallszahlen ist ohne Bibliotheken kein triviales Problem. Das ist das einzige was interessant wäre.
Dazu könnte/müßte man eigentlich mal einen separaten Thread aufmachen.

Verfasst: Samstag 10. Januar 2009, 19:31
von HWK
Die Zufallszahl bestimme ich einfach aus der Systemuhr (int 1Ah) modulo 100 plus 1 (Programmteil von _start: bis next:). Übrigens: Der Code ist nicht mies kommentiert, sondern gar nicht.:lol:
MfG
HWK

Verfasst: Samstag 10. Januar 2009, 19:38
von numerix
Für 281 Bytes braucht es doch auch keinen Kommentar ...