function-arguments by reference

EsC christian.eslbauer at liwest.at
Tue Dec 30 14:10:42 EST 2003


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
- 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.






More information about the Python-list mailing list