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