function-arguments by reference
Matt Goodall
matt at pollenation.net
Tue Dec 30 15:42:10 EST 2003
EsC wrote:
>hy JCM!
>
>damned - you are right!
>i didn't know the way Python is handling arguments
>up to now! It's a little bit different to other languages
>i know - and somtimes even a little bit easier.
>
>i made some (useless) performance-tests to proof your exclamations ...
>if somebody is interested: i enclosed the code and results ...
>
>- String 1 & String2: only read-access within the called function
>the runtime is almost identical; therefore the text of the string can't
>be copied
>
>
I don't think your test code proves that the string is not copied, only
that passing a reference to a string takes approximately the same amount
of time as passing a reference to a list and accessing the 1st item.
A better "proof" that the string is not copied is:
>>> s1 = 'this is a string'
>>> def f(s2):
... print s1 is s2
...
>>> f(s1)
True
>>>
The "True" result indicates that both s1 and s2 are bound to the same
string object.
>- String 3: the argument string is modified but NOT passed back to
>the caller;
>- String 4: the argument string is passed "by reference" within a
>list object and modified.
>
>i think this informations are very interesting
>thanks!
>
>greetings
>iolo
>
>
>------------ CODE -------------
>import sys
>from string import *
>from time import *
>
>def ls(str):
> return len(str)
>
>def ll(str):
> return len(str[0])
>
>def as(str):
> str += "x"
> return len( str )
>
>def al(str):
> str[0] += "x"
> return len( str[0] )
>
>loop = 2000
>strlen = 30000
>strl = []
>strl.append("")
>strs = ""
>
>for a in range(strlen):
> strs += 'x'
> strl[0] += 'y'
>
>print "Loop: ", loop
>print "Stringlength: " , strlen
>
>print
>print 'String 1'
>l = 0
>start = time()
>for x in range(loop):
> l += ls(strs)
>end = time()
>print "duration in seconds: ", end - start
>print "result: ", l
>if strlen == l / loop:
> print 'OK'
>else:
> print 'ERROR'
>
>print
>print 'String 2'
>l = 0
>start = time()
>for x in range(loop):
> l += ll(strl)
>end = time()
>print "duration in seconds: ", end - start
>print "result: ", l
>if strlen == l / loop:
> print 'OK'
>else:
> print 'ERROR'
>
>print
>print 'String 3'
>l = 0
>start = time()
>for x in range(loop):
> l += as(strs)
>end = time()
>print "duration in seconds: ", end - start
>print "result: ", l
>if l == loop * strlen + loop:
> print 'OK'
>else:
> print 'ERROR'
>
>print
>print 'String 4'
>l = 0
>start = time()
>for x in range(loop):
> l += al(strl)
>end = time()
>print "duration in seconds: ", end - start
>print "result: ", l
>if l == (loop / 2 ) * ((strlen + 1) + (strlen + loop)):
> print 'OK'
>else:
> print 'ERROR'
>
>---------------- RESULT ----------------
>Loop: 50000
>Stringlength: 200000
>
>String 1
>duration in seconds: 0.0620000362396
>result: 10000000000
>OK
>
>String 2
>duration in seconds: 0.0779999494553
>result: 10000000000
>OK
>
>String 3
>duration in seconds: 3.2349998951
>result: 10000050000
>OK
>
>String 4
>duration in seconds: 5.93700003624
>result: 11250025000
>OK
>--------------------------------------------------
>
>"JCM" <joshway_without_spam at myway.com> schrieb im Newsbeitrag
>news:bss7u2$18e$1 at fred.mathworks.com...
>
>
>>EsC <christian.eslbauer at liwest.at> wrote:
>>
>>
>>>hy!
>>>
>>>
>>>thanks for your explanations!
>>>
>>>
>>>i want to avoid performance-problems by repeated (very often)
>>>function-calls with very long strings.
>>>in some languages (C, PHP, Powerbuilder, ...) i have the opportunity,
>>>to pass "by value" or "by reference/pointer)".
>>>
>>>
>>The text of the string is not copied; a reference to the string/object
>>is passed into the function. You can modify objects passed into
>>functions (but only if they're mutable--strings and integers are
>>examples of immutable objects), but you cannot rebind the variable
>>holding the value in the caller's scope.
>>
>>There have been some discussions in this newsgroup about whether
>>Python is call-by-value or not. I'm not sure if I want to recommend
>>looking for them; there was no good consensus about the terminology.
>>
>>
>
>
>
>
--
Matt Goodall, Pollenation Internet Ltd
w: http://www.pollenation.net
e: matt at pollenation.net
More information about the Python-list
mailing list