From: Austin Ziegler Date: 2003-09-16T04:38:35+09:00 Subject: Re: performance and style advice requested This is a multipart message in MIME format --13556731-POCO-21804255 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable On Tue, 16 Sep 2003 02:07:53 +0900, Alex Martelli wrote: > Ben Giddings wrote: >> Some style advice: >> On Sunday, September 14, 2003, at 12:44 PM, Alex Martelli wrote: >>> # factorial, memoized via an Array >>> $_fact_memo=3D[1,1,2,6,24,120,720] >> Ugh. This is what really bothers me about python programs. Ugly >> underscores. > Heh -- matter of taste, I guess; what _I_ personally find ugly is > that leading $, and I left the underscores in to try to ameliorate > that. Of course, nothing stops you from moving to a camelCaseish > $factMemo -- however, not only do I personally find that less > readable, but I'd also like to leave a hint that the memo is an > internal implementation detail, not a feature meant for external > consumption, and I like the convention of a leading _ for that. > (Of course, I _could_ wrap up the fact function and its memo in a > single package in any of various ways, I'm sure, so the "hint" > aspect is quite secondary). Why not use a constant? In my unrolled implementation, that's what I do. It's is a bit slower (but, as far as I can tell, not in the unrolled implementations), but doesn't take advantage of the algorithmic shortcut hinted at in earlier messages. FACT_MEMO =3D [1, 1, 2, 6, 24, 120, 720] def fact!(x) return 0 if x < 0 result =3D FACT_MEMO[x] unless result ((FACT_MEMO.size)..x).each do |i| FACT_MEMO[i] =3D i * FACT_MEMO[i - 1] end result =3D FACT_MEMO[x] end result end I'm sure there's other improvements that can be done; I went for Ruby-idiom readability. If it's not meant to be public at all, then since I'm using a class here, I can use an instance variable (e.g., @fact_memo or @__fact_memo__). I'd much rather use a constant (FACT_MEMO) than a global ($_fact_memo). (This does point out a problem with the VIM syntax highlighting for Ruby, in that it doesn't properly highlight $_fact_memo because it finds $_.) I don't think that I've used a single global variable in my Ruby programming. I'm attaching my version to this message. -austin -- austin ziegler * austin@halostatue.ca * Toronto, ON, Canada software designer * pragmatic programmer * 2003.09.15 * 15.28.27 --13556731-POCO-21804255 Content-Type: application/octet-stream; name="pointcount.rb" Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename="pointcount.rb" cmVxdWlyZSAncHAnCnJlcXVpcmUgJ2ZpeG51bV9mb3JtYXQnCgpjbGFzcyBQb2ludENvdW50CiAg bW9kdWxlIEhvbm9yc1N1YnNldAogICAgICAjIEEgcmVjdXJzaXZlIGl0ZXJhdG9yIG92ZXIgaG9u b3Itc3Vic2V0cy4KICAgICAgIwogICAgICAjIEFuIGhvbm9yIGlzIHJlcHJlc2VudGVkIGJ5IGl0 cyBwb2ludCB2YWx1ZSAoMSAuLiA0KTsgYW4gaG9ub3Itc3Vic2V0IGlzCiAgICAgICMgYSBwYWly ICh0b3RhbCBwb2ludGNvdW50LCBudW1iZXIgb2YgaG9ub3JzKS4KICAgIGRlZiBlYWNoX3N1YnNl dChmcm9tID0gMCkKICAgICAgICAjIEVuZCBvZiBhcnJheSwgc28sIHJldHVybiAyIG9ubHkgcG9z c2libGUgc3Vic2V0cyByZW1haW5pbmc6IGVtcHR5IHNldCwKICAgICAgICAjIG9yIHNpbmdsZXRv biBzZXQgd2l0aCB0aGUgbGFzdCBlbGVtZW50IGluIGl0CiAgICAgIGlmIGZyb20gPT0gc2l6ZSAt IDEKICAgICAgICB5aWVsZCBbMCwgMF0KICAgICAgICB5aWVsZCBbc2VsZltmcm9tXSwgMV0KICAg ICAgZWxzZQogICAgICAgICAgIyAyKyBlbGVtZW50cyByZW1haW5pbmcsIHNvLCBsb29wIGl0ZXJh dGl2ZWx5LCBleHRyYWN0aW5nIHRoZSBjdXJyZW50CiAgICAgICAgICAjIGVsZW1lbnQgYW5kIGdl dHRpbmcgYWxsIHBvc3NpYmxlIHN1YnNldHMgb2YgYWxsIGxhdGVyIG9uZXMgLS0gZm9yCiAgICAg ICAgICAjIGVhY2ggb2YgdGhvc2UsIHJldHVybiAyIHBvc3NpYmxlIHN1YnNldHMsIGkuZS4sIGVp dGhlciB3aXRob3V0IG9yCiAgICAgICAgICAjIHdpdGggdGhlIGN1cnJlbnQgZWxlbWVudAogICAg ICAgIHRoaXNwb2ludHMgPSBzZWxmW2Zyb21dCiAgICAgICAgc2VsZi5lYWNoX3N1YnNldChmcm9t ICsgMSkgZG8gfHN1YnBvaW50cywgc3VibGVuZ3RofAogICAgICAgICAgeWllbGQgW3N1YnBvaW50 cywgc3VibGVuZ3RoXQogICAgICAgICAgeWllbGQgW3RoaXNwb2ludHMgKyBzdWJwb2ludHMsIDEg KyBzdWJsZW5ndGhdCiAgICAgICAgZW5kCiAgICAgIGVuZAogICAgZW5kCiAgZW5kCgogIEZBQ1Rf TUVNTyA9IFsxLCAxLCAyLCA2LCAyNCwgMTIwLCA3MjBdCiAgQ09NQl9NRU1PID0ge30KCiAgZGVm IGZhY3QhKHgpCiAgICByZXR1cm4gMCBpZiB4IDwgMAogICAgcmVzdWx0ID0gUG9pbnRDb3VudDo6 RkFDVF9NRU1PW3hdCgogICAgdW5sZXNzIHJlc3VsdAogICAgICAoKEZBQ1RfTUVNTy5zaXplKS4u eCkuZWFjaCBkbyB8aXwKICAgICAgICBGQUNUX01FTU9baV0gPSBpICogRkFDVF9NRU1PW2kgLSAx XQogICAgICBlbmQKICAgICAgcmVzdWx0ID0gRkFDVF9NRU1PW3hdCiAgICBlbmQKCiAgICByZXN1 bHQKICBlbmQKCiAgICAjIENvbWJpbmF0aW9ucyBvZiB4IHRoaW5ncyB5IGF0IGEgdGltZSAoMCBp ZiB4IDwgMCwgeSA8IDAsIG9yIHkgPiB4KQogICAgIyBNZW1vaXplZCB2aWEgYSBIYXNoLgogIGRl ZiBjb21iKHgsIHkpCiAgICByZXR1cm4gMCBpZiB5ID4geCBvciB4IDwgMCBvciB5IDwgMAogICAg cmVzdWx0ID0gUG9pbnRDb3VudDo6Q09NQl9NRU1PW1t4LCB5XV0KICAgIHJlc3VsdCA9IFBvaW50 Q291bnQ6OkNPTUJfTUVNT1tbeCwgeV1dID0gZmFjdCEoeCkgLyAoZmFjdCEoeSkgKiBmYWN0ISh4 IC0geSkpIHVubGVzcyByZXN1bHQKICAgIHJlc3VsdAogIGVuZAoKICBkZWYgcG9pbnRjb3VudAog ICAgaGlzdG9ncmFtID0gSGFzaC5uZXcgeyB8aCwga3wgaFtrXSA9IDAgfQogICAgdG90YWwgPSAw CiAgICBob25vcnMgPSBBcnJheSgxLi40KSAqIDQKICAgIGhvbm9ycy5leHRlbmQoUG9pbnRDb3Vu dDo6SG9ub3JzU3Vic2V0KQogICAgaG9ub3JzLmVhY2hfc3Vic2V0IGRvIHxwdCwgbmh8CiAgICAg ICAgIyByZWNlaXZlIG51bWJlciBvZiBob25vcnMgYW5kIHBvaW50Y291bnQgZm9yIHRoaXMgaG9u b3JzZXQsIHRoZW4KICAgICAgICAjIGNvbXB1dGUgbnVtYmVyIG9mIHBvc3NpYmxlIG9jY3VycmVu Y2VzIG9mIHRoaXMgaG9ub3JzZXQKICAgICAgbmMgPSBjb21iKDM2LCAoMTMgLSBuaCkpCiAgICAg ICAgIyB1cGRhdGUgaGlzdG9ncmFtIGFuZCB0b3RhbAogICAgICBoaXN0b2dyYW1bcHRdICs9IG5j CiAgICAgIHRvdGFsICs9IG5jCiAgICBlbmQKCiAgICAgICMgcHJpbnQgdG90YWwgYW5kIGV5ZWJh bGwtY2hlY2sgaXQKICAgIHB1dHMgIiN7dG90YWwuZm9ybWF0X3N9ICN7Y29tYig1MiwgMTMpLmZv cm1hdF9zfVxuXG4iCiAgICAgICMgc29ydCBoaXN0b2dyYW0gYnkgZGVjcmVhc2luZyBmcmVxdWVu Y3kKICAgIGF1eCA9IGhpc3RvZ3JhbS5zb3J0IHsgfGEsIGJ8IGJbMV0gPD0+IGFbMV0gfQoKICAg ICAgIyBjb21wdXRlIGZyZXF1ZW5jaWVzIGFzIHJlbGF0aXZlIHBlcmNlbnRhZ2VzCiAgICBkaXZp cyA9IHRvdGFsIC8gMTAwLjAKCiAgICAgICMgZ2l2ZSB0b3AgMTAgcG9zc2liaWxpdGllcwogICAg YXV4WzAuLi4xMF0uZWFjaCBkbyB8cHQsIG5jfAogICAgICBwdXRzICIlNWQgJTE1cyAoJTUuMmYp IiAlIFtwdCwgbmMuZm9ybWF0X3MsIG5jIC8gZGl2aXNdCiAgICBlbmQKICBlbmQKZW5kCgpwYyA9 IFBvaW50Q291bnQubmV3CnN0YXJ0ID0gVGltZS5ub3cKcGMucG9pbnRjb3VudApwcCBQb2ludENv dW50OjpDT01CX01FTU8KcHV0cyAiVGltZTogI3tUaW1lLm5vdyAtIHN0YXJ0fSIK --13556731-POCO-21804255--