Should I avoid converting to a string if a value is already a string?
Solution 1:
Testing if an object is already a string is slower than just always converting to a string.
That's because the str()
method also makes the exact same test (is the object already a string). You are a) doing double the work, and b) your test is slower to boot.
Note: for Python 2, using str()
on unicode
objects includes an implicit encode to ASCII, and this can fail. You may still have to special case handling of such objects. In Python 3, there is no need to worry about that edge-case.
As there is some discussion around this:
-
isinstance(s, str)
has a different meaning whens
can be a subclass ofstr
. As subclasses are treated exactly like any other type of object bystr()
(either__str__
or__repr__
is called on the object), this difference matters here. -
You should use
type(s) is str
for exact type checks. Types are singletons, take advantage of this,is
is faster:>>> import timeit >>> timeit.timeit("type(s) is str", "s = ''") 0.10074466899823165 >>> timeit.timeit("type(s) == str", "s = ''") 0.1110201120027341
-
Using
s if type(s) is str else str(s)
is significantly slower for the non-string case:>>> import timeit >>> timeit.timeit("str(s)", "s = None") 0.1823573520014179 >>> timeit.timeit("s if type(s) is str else str(s)", "s = None") 0.29589492800005246 >>> timeit.timeit("str(s)", "s = ''") 0.11716728399915155 >>> timeit.timeit("s if type(s) is str else str(s)", "s = ''") 0.12032335300318664
(The timings for the
s = ''
cases are very close and keep swapping places).
All timings in this post were conducted on Python 3.6.0 on a Macbook Pro 15" (Mid 2015), OS X 10.12.3.