Python: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 41: | Line 41: | ||
= Classes = | = Classes = | ||
* You don't need to | * You don't need to explicitly declare class fields, as they are dynamically created the first time you assign them. | ||
* Every class method should take as a first argument "self". | * Every class method should take as a first argument "self". | ||
* Accessing an object attribute, when the attribute does not exist, results in an exception. Code like: | * Accessing an object attribute, when the attribute does not exist, results in an exception. Code like: | ||
Line 48: | Line 48: | ||
will not work as expected if myAttribute was not assigned. One easy solution is to define in the class initializer method (__init__) the attribute and set it equal to None. | will not work as expected if myAttribute was not assigned. One easy solution is to define in the class initializer method (__init__) the attribute and set it equal to None. | ||
= Profiling = | |||
== cProfile == | |||
* This profiler is built-in to Python. It produces profiling data related to the CPU usage / time spent in each method, and can thus be useful to locate performance bottlenecks. | |||
* You can use snakeviz as a GUI to better analyze the results produced by cProfile. | |||
* To start profiling, use: | |||
profiler = cProfile.Profile() | |||
profiler.enable() | |||
* Note that any method printing or exporting profiling data (like stats.dump_stats()) will "pause" the profiler. You will need to manually call profiler.enable() again, and then data collection will resume (aggregating into the previous profiler object, it does not reset statistics). This is a bit strange and not documented. |
Revision as of 19:03, 9 August 2023
Important changes from Java
- When you pass an object to a function, and "reassign" it using its local function argument name, the outside objects won't get reassigned. This is because Python reassigns the local name only. This is a important difference from Java.
Useful techniques
- To iterate over two lists at the same time, use the zip built-in function:
for a, b in zip(list1, list2):
- To use the condition ? a : b construct:
a if condition else b
Casts
- To cast a float to an integer, you can use the built-in int() function.
Exceptions
- Sample code to deal with an exception:
try: doSomething() except Exception, inst: print str(inst.args) print str(sys.exc_info()[0])
This will give you information about the raised exception type.
Scopes
Within a module, inside a function, you can access the module variables normally. However, assigning them is not possible (you would assign a local variable). To assign a module variable inside a function, you need to specify that the variable is global by using the global keyword.
global myVariable
This is quite strange!
Classes
- You don't need to explicitly declare class fields, as they are dynamically created the first time you assign them.
- Every class method should take as a first argument "self".
- Accessing an object attribute, when the attribute does not exist, results in an exception. Code like:
if object.myAttribute:
will not work as expected if myAttribute was not assigned. One easy solution is to define in the class initializer method (__init__) the attribute and set it equal to None.
Profiling
cProfile
- This profiler is built-in to Python. It produces profiling data related to the CPU usage / time spent in each method, and can thus be useful to locate performance bottlenecks.
- You can use snakeviz as a GUI to better analyze the results produced by cProfile.
- To start profiling, use:
profiler = cProfile.Profile() profiler.enable()
- Note that any method printing or exporting profiling data (like stats.dump_stats()) will "pause" the profiler. You will need to manually call profiler.enable() again, and then data collection will resume (aggregating into the previous profiler object, it does not reset statistics). This is a bit strange and not documented.