Since the time python became popular, it has become many developers’ go to programming tools to develop a web application, mobile application, robotics, AI, and ML. In fact, Python For AI has been a wonderful combination of recent times.
It offers tons of features for which we previously had to revolve around multiple programming languages. But python is all-inclusive. Therefore, it has become a favorite tools for businesses looking to hire python experts.
It opens a world of possibilities for any programmer. Even after having so many avenues, it is still not difficult to learn, if that’s what you are scared of.
Our Agile team of python developers has been working on various projects for their clients across the globe and through their research and experience they have cluttered a list of 30 tips you can use for faster coding. Let’s check them out.
Use List Comprehensions
In any software development language, we come across the looping condition. But before that, we need to create a comprehension list. The simple way to create it is illustrated with an example.
To determine the cubes of all the odd numbers in a particular series the code is as follows
cube_numbers = [] for n in range(0,10): if n % 2 == 1: cube_numbers.append(n**3)
This is a three-line approach which programmers wrap into a single line with a comprehensive listing
cube_numbers = [n**3 for n in range(1,10) if n%2 == 1]
This procedure is more precise and renders a faster execution of the entire loop.
It makes a considerable difference while working with Python and not with any other language as it has the features that makes a difference in terms of execution time.
Once a programmer understands the process, the programs run fast.
Remember Built-In Functions
Python has its unique share of built-in functions like other mid or high-level languages. If you are thinking about writing a piece of phenomenal code in python, you can do that with quite a bit of ease.
The vast built-in library functions help in duplicating multiple features in your development project. With these offers, you can optimize your code volume, and there is no redundant code.
The quality of coding improves, making it easier for the testing team to analyse if the program goes into error. Shorter the length of the code, lesser is the error.
Use xrange() Instead Of range()
Iteration in loops is a common practise while programming in Python. For this purpose, there are 2 functions range() and xrange(). Range() reserves the data associated with all integers in the given range.
It is distributed in the program memory. Xrange(), returns the generator object. When we put this object in a loop, the data in storage is only called for.
import sys numbers = range(1, 1000000) print(sys.getsizeof(numbers))
This answer for range() is 8000064, and the same for xrange() is 40. You cannot switch between these functions at your will while using Python 2.
It leaves a significant influence on memory usage and Python Performance. With Python 3, there is an end to these problems. All have the Xrange() functionality, implemented by default. The range() function plays the same role in the absence of xrange() in Python 3.
Write Your Generator
Python allows the user to return one piece of information at a time rather than all together. Xrange() and range() functions explains the concept.
When coders use their generators, while working with lists, they boost up the lazy loading and memory efficiency.
These generators augment the process of reading several large files at a stretch. Size of the file no longer matters as we can select the blocks of code that we want to process.
import requests import re def get_pages(link): pages_to_visit = [] pages_to_visit.append(link) pattern = re.compile('https?') while pages_to_visit: current_page = pages_to_visit.pop(0) page = requests.get(current_page) for url in re.findall('<a href="([^"]+)">', str(page.content)): if url[0] == '/': url = current_page + url[1:] if pattern.match(url): pages_to_visit.append(url) yield current_page webpage = get_pages('http://www.example.com') for result in webpage: print(result)
The above example shows that developers can display one output at a time, or perform any operation selectively. The code looks clutter-free, aligned, and runs without going into error.
The generator makes the process simpler as collecting all the links is no longer required, until the process starts. So, always try to follow these Python Performance Tips.
Use “in” If Possible
If you are thinking of a quick way to verify the membership of a list, you can do so using the ‘in’ keyword.
for name in member_list: print('{} is a member'.format(name))
Be Lazy With Module Import
Having hands-on knowledge of other PLs, we know how and why we need to import all the libraries and modules at the start of the project. Once loaded, we sort these in alphabetical order.
It helps us monitor the dependencies in our project but loads all imports at startup. This delays the process.
Python helps us to avert this delay by loading the modules based on our requirement. It optimizes the programming time, reduces loading time for modules, and balances sharp usage of memory.
Use Sets and Unions
Professional software developers do not deny that the presence of ample loops in a code strains the server. You cannot be a good coder if you use too many loops. There is a different route to use looping functionality.
To get the coinciding values in two lists, we can opt for nested looping.
a = [1,2,3,4,5] b = [2,3,4,5,6] overlaps = [] for x in a: for y in b: if x==y: overlaps.append(x) print(overlaps)
With a nested loop, the output will be like [2, 3, 4, 5].
Let us see another way to get the same output.
a = [1,2,3,4,5] b = [2,3,4,5,6] overlaps = set(a) & set(b) print(overlaps)
The output is the dictionary {2, 3, 4, 5}. We are using the inbuilt functions here to obtain acceleration and memory boost.
Use Multiple Assignments
There is a cool way in which you can assign values to variables using Python.
first_name, last_name, city = "Kevin", "Cunningham", "Brighton"
To switch between values you can swap them using this technique.
x, y = y, x
This coding style makes your code error-free and compiles your project quickly.
temp = x x = y y = temp
Avoid Global Variable
A good code, in Python, is one with minimum usage of global variables.
Not only does it generate an effective design pattern but also it helps keep track of reach, and prevents redundant memory usage.
Programmers who worked with Python deduced that python retrieves a local variable way faster than a global one.
Use join() for String Concatenation
To print a statement using a list of words is possible in Python, either by concatenating them with “+” or by using the join() keyword. Strings in Python are permanent and do not take space between them when we use the “+” operator.
To print a string more acceptably, we can use an array module to fetch each character of the string. Then we can concatenate them using join() keyword to generate the final string.
new = "This" + "is" + "going" + "to" + "require" + "a" + "new" + "string" + "for" + "every" + "word" print(new)
The output will be
Thisisgoingtorequireanewstringforeveryword
Using join() the output looks like
new = " ".join(["This", "will", "only", "create", "one", "string", "and", "we", "can", "add", "spaces."]) print(new)
The output looks legible and acceptable.
This will only create one string and we can add spaces.
Keep An Eye On New Python Releases
The developers of Python keep updating the programming language so that we build better applications with time. Those who work on python for their projects keep a track of newer releases and updates.
This enhances Python Performance and makes the application more robust. With every new update or release of Python, its performance and security becomes better invariably.
Developers need to ensure that the libraries are compatible with the latest release before they begin working on it.
Use “while 1” For Infinite Loop
Looping in python is extremely necessary for python projects. We use looping using ‘while’ when we want to iterate a block of code if it is true.
The regular way to do so is by using ‘while True’. While there is nothing wrong with this technique, we can achieve the same result faster executing the code using ‘while 1’. It is a numerical conversion and generates output faster.
Try Another Way
After coding successfully, we tend to reuse the code for other projects. It is human nature to count on the methods that have been tried and tested successfully.
However, with python, there is always a scope to try newer avenues so that we can figure out which ones are the best for development. It keeps the learning curve growing and steep.
Newbies get a lot of encouragement when they become creative with this programming language and build wondrous applications with excellent coding. No wonder, we can reach heights with coding in Python.
Exit Early
Expert developers know when they can work on a meaningful code and when they have reached a dead end. When they understand that the program will not run, they exit early.
It is good coding practice as it prevents us from wasting time and labour on fruitless tasks. These include a whole code or parts within a code block. They create a new functional logic without nested if statements.
if positive_case: if particular_example: do_something else: raise exception
Before deploying the code and running an application, it is customary to test the components of the code. The tests should run standard and expected results.
Developers can carry out the actions and tasks in sequential order. You can test the input in a few ways before carrying out your actions.
Debugging and exception handling cases can help enlighten coders on a new logic, or change in their algorithm.
if not positive_case: raise exception if not particular_example: raise exception do_something
Once you visualize what you can achieve from your algorithm, you may or may not follow the conditionals. The sooner you detect it, the earlier you can make necessary changes for better functionality.
Learn itertools
Using itertools is the novel feature of Python programming. It consists of a set of programs that come when we import the itertools library before starting our python project.
Developers design class apart websites by using itertools. They make the development fast, memory enabled, and produce a smooth application.
Most people are unaware of this new feature from Python. It can be used to deal with permutations and combinations. Take an instance where a user wants to produce all the permutations of [“Alice”, “Bob”, “Carol”].
import itertools iter = itertools.permutations(["Alice", "Bob", "Carol"]) list(iter)
Users can display all possible permutations with this code.
[('Alice', 'Bob', 'Carol'), ('Alice', 'Carol', 'Bob'), ('Bob', 'Alice', 'Carol'), ('Bob', 'Carol', 'Alice'), ('Carol', 'Alice', 'Bob'), ('Carol', 'Bob', 'Alice')]
Use Decoder Caching
Storing files in cache memory help restore the functions quickly. Python supports decoder caching that maintains a specific type of caching in memory for optimal software driving speeds.
Developers can retrieve these outputs on an online page or run high-end applications and calculations. We can show this with the working principle of calculating the 100th Fibonacci number.
We display the Fibonacci series of the first 100 numbers as 1, 1, 2, 3, 5 …
The following is a code to calculate these:
def fibonacci(n): if n == 0: # There is no 0'th number return 0 elif n == 1: # We define the first number as 1 return 1 return fibonacci(n - 1) + fibonacci(n-2)
Once you have this code, displaying a series in output is a cakewalk. The calculation to determine the 36th Fibonacci number, Fibonacci(36) takes a few seconds to produce the answer 14,930,352.
When we consider caching our program, this code further wraps up into a few lines only.
import functools @functools.lru_cache(maxsize=128) def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 return fibonacci(n - 1) + fibonacci(n-2)
If you want to extend the usage of one function to another, you need to use a decorator function. Use the @ symbol to initiate a decorator function.
In an illustration, a programmer practised the decorator functions.lru_cache available from the functools module.
For those of you wondering, there are different kinds of decorator caching, some that you can build on your own.
Make Use Of Keys For Sorting
Sorting is a process in high-level language python where developers arrange the output in a definite order. There are many key ways in which we can sort our result. Some of these methods which involve writing lots of codes are obsolete.
These days we design a custom sort and devote time in setting up and in performing the sort. Using the default sort() method whenever possible is the appropriate practice to arrange items in our code.
The built-in functions prove to be extremely useful in sequentially ordering our results very quickly.
import operator my_list = [("Josh", "Grobin", "Singer"), ("Marco", "Polo", "General"), ("Ada", "Lovelace", "Scientist")] my_list.sort(key=operator.itemgetter(0)) my_list
Sorting of the list by the first keys
[('Ada', 'Lovelace', 'Scientist'), ('Josh', 'Grobin', 'Singer'), ('Marco', 'Polo', 'General')] Sorting can also happen using the second key: my_list.sort(key=operator.itemgetter(1)) my_list
The second names are as follows.
[('Josh', 'Grobin', 'Singer'), ('Ada', 'Lovelace', 'Scientist'), ('Marco', 'Polo', 'General')]
For all these methods, the list is classified under the directory you pick as part of the principal discussion. The function applies to numbers, strings, and is simple and quick.
Don’t Use Set Of Condition
While developing a project, sometimes we want the algorithm to optimize, as in this example.
if animal in set(animals):
This is very essential in coding. This particular code explains that there are many animals, and de-duplicating them thus hastening up the process
if animal in animals:
While undertaking such tasks in its process, the interpreter optimizes to an extent such that the set function slows down matters. Using the “in” keyword is way quicker an operation instead of using the set function.
Use the Linked List
In Python, we can represent a collection of data of similar data type in an array. We can also create a linked list of values in an array. Without a linked list, adding values in any position of a sequence can be a near-impossible task in a development project.
In a linked list, we can move the position of data and add new data in the place that we want. A linked list is necessary here, as each object shares a connection to the subsequent object in the list.
When we use arrays in our projects we have to bear with the cost of memory allocation. This is a waste as we cannot predict the space array will occupy in advance.
But we can avoid such problems when we use a linked list. A linked list enhances the Python Performance and allots the memory when required. The program stores the linked lists in different parts of memory and joins them together.
The only catch in here is that searching for an item might get delayed. Developers do extensive profiling to figure out if this method is better for them.
Read also: Python vs PHP: Which Is The Better Programming Language?
Use the Performance Tool
When a developer builds a code on a local machine, they employ profiling tools to figure out what causes lags in an application. When they deploy the project live on the web, things work out differently.
Programmers can gauge the performance and efficacy of their application after they deploy it on the web. Python Performance Profiler helps in code profiling, fault tracking, and server metrics.
Profiling Code
Initially, we need to understand that speeding up of a Python Performance Profiler can happen if we remove bottlenecks. A code that developers have tested and certified as working fine, should ideally run fast.
import profile profile.run('main()')
Python profiling modules are vastly distributed in the program. We can utilise them for profile execution to make our functions run smoothly.
We can explain the process with examples as follows. If the main function is devoid of arguments, we can complete it under the profile module. This kind of execution is simple for anyone.
Once the main() section runs and returns output, the Python Performance Profiler returns a module and a series of function calls. They can modify the output by including the Stats class with the module.
Data Aggregation
Calling a function in a python code does not take much time to execute. We can say that it is higher than that of a builtin function.
This is one of the Python Performance Tips that underscores the fact that functions handle data aggregates effectively. The following code shows the data aggregation paradigm.
import time x = 0 def doit1(i): global x x = x + i list = range(100000) t = time.time() for i in list: doit1(i) print "%.3f" % (time.time()-t) vs. import time x = 0 def doit2(list): global x for i in list: x = x + i list = range(100000) t = time.time() doit2(list) print "%.3f" % (time.time()-t) Here's the proof in the pudding using an interactive session: >>> t = time.time() >>> for i in list: ... doit1(i) ... >>> print "%.3f" % (time.time()-t) 0.758 >>> t = time.time() >>> doit2(list) >>> print "%.3f" % (time.time()-t) 0.204
The benefit of Python Performance is here as the second code runs around four times more durable than the first. If we write the same command in C the variance would be immense.
Know Python GIL
GIL is inevitable because developers cannot rely on CPython’s memory management. It limits developers from creating multiple threads. In contrast, Python runs faster as it has a multi-core computer.
The python GIL blocks multiple native threads from performing Python bytecodes. We can hasten up the program by using threads to accomplish several pronged methods, which are operating autonomously.
Know Data Structure
We use sets or dictionaries rather than lists in cases where:
- The selection contains a great number of items
- Users search for items in the collection
- No duplicate items
Reduce Memory
There are some ways to reduce memory usage in Python:
- Generators result in the slower generation of values, resulting in lower memory usage. In Python 3 range, d.items() return generators.
- sort() substitutes sorted() which creates a redundant duplicate.
Conclusion
These Python Performance Tips bring about a sea change when developers work in this language. Some pros, cons, and questions still remain where developers are still working to make Python better than ever.
We firmly believe that the integrated design and architecture will continue to help many people in Python Development Services. Thank You.!
-
Which data type is faster in Python?
Python is very fast at checking if an element exists in a dictionary or in a set. The lookup can be as fast as O(1).
-
Can Python be made faster?
If you want to compile Python into faster code then use the currently experimental Nuitka project or you can also use Cython and Numba.
-
How To Measure The Performance Of A Python Program?
Python provides the timeit module for measuring the execution time of code snippets. This can be called from the command line, or by importing it into an existing program.
-
Which Loop Is Faster In Python?
An implied loop is faster than an explicit loop. The while loop with explicit calling is slower than this case. As a programmer, you should avoid calling inner loops in python.