From 33b4e7d7548e59d1bb2c2e9c69d323a60eb8f286 Mon Sep 17 00:00:00 2001 From: Krish C Naik Date: Fri, 21 Jun 2024 18:11:12 +0530 Subject: [PATCH 1/3] Add files via upload --- 13-Flask/flask/api.py | 68 +++++++++++++++++++ 13-Flask/flask/app.py | 19 ++++++ 13-Flask/flask/getpost.py | 37 ++++++++++ 13-Flask/flask/jinja.py | 89 +++++++++++++++++++++++++ 13-Flask/flask/main.py | 23 +++++++ 13-Flask/flask/sample.json | 3 + 13-Flask/flask/templates/about.html | 11 +++ 13-Flask/flask/templates/form.html | 15 +++++ 13-Flask/flask/templates/getresult.html | 29 ++++++++ 13-Flask/flask/templates/index.html | 11 +++ 13-Flask/flask/templates/result.html | 11 +++ 13-Flask/flask/templates/result1.html | 19 ++++++ 12 files changed, 335 insertions(+) create mode 100644 13-Flask/flask/api.py create mode 100644 13-Flask/flask/app.py create mode 100644 13-Flask/flask/getpost.py create mode 100644 13-Flask/flask/jinja.py create mode 100644 13-Flask/flask/main.py create mode 100644 13-Flask/flask/sample.json create mode 100644 13-Flask/flask/templates/about.html create mode 100644 13-Flask/flask/templates/form.html create mode 100644 13-Flask/flask/templates/getresult.html create mode 100644 13-Flask/flask/templates/index.html create mode 100644 13-Flask/flask/templates/result.html create mode 100644 13-Flask/flask/templates/result1.html diff --git a/13-Flask/flask/api.py b/13-Flask/flask/api.py new file mode 100644 index 000000000..270ff823b --- /dev/null +++ b/13-Flask/flask/api.py @@ -0,0 +1,68 @@ +### Put and Delete-HTTP Verbs +### Working With API's--Json + +from flask import Flask, jsonify, request + +app = Flask(__name__) + +##Initial Data in my to do list +items = [ + {"id": 1, "name": "Item 1", "description": "This is item 1"}, + {"id": 2, "name": "Item 2", "description": "This is item 2"} +] + +@app.route('/') +def home(): + return "Welcome To The Sample To DO List App" + +## Get: Retrieve all the items + +@app.route('/items',methods=['GET']) +def get_items(): + return jsonify(items) + +## get: Retireve a specific item by Id +@app.route('/items/',methods=['GET']) +def get_item(item_id): + item=next((item for item in items if item["id"]==item_id),None) + if item is None: + return jsonify({"error":"item not found"}) + return jsonify(item) + +## Post :create a new task- API +@app.route('/items',methods=['POST']) +def create_item(): + if not request.json or not 'name' in request.json: + return jsonify({"error":"item not found"}) + new_item={ + "id": items[-1]["id"] + 1 if items else 1, + "name":request.json['name'], + "description":request.json["description"] + + + } + items.append(new_item) + return jsonify(new_item) + +# Put: Update an existing item +@app.route('/items/',methods=['PUT']) +def update_item(item_id): + item = next((item for item in items if item["id"] == item_id), None) + if item is None: + return jsonify({"error": "Item not found"}) + item['name'] = request.json.get('name', item['name']) + item['description'] = request.json.get('description', item['description']) + return jsonify(item) + +# DELETE: Delete an item +@app.route('/items/', methods=['DELETE']) +def delete_item(item_id): + global items + items = [item for item in items if item["id"] != item_id] + return jsonify({"result": "Item deleted"}) + + + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/13-Flask/flask/app.py b/13-Flask/flask/app.py new file mode 100644 index 000000000..dfdd9fc91 --- /dev/null +++ b/13-Flask/flask/app.py @@ -0,0 +1,19 @@ +from flask import Flask +''' + It creates an instance of the Flask class, + which will be your WSGI (Web Server Gateway Interface) application. +''' +###WSGI Application +app=Flask(__name__) + +@app.route("/") +def welcome(): + return "Welcome to this best Flask course.This should be an amazing course" + +@app.route("/index") +def index(): + return "Welcome to the index page" + + +if __name__=="__main__": + app.run(debug=True) \ No newline at end of file diff --git a/13-Flask/flask/getpost.py b/13-Flask/flask/getpost.py new file mode 100644 index 000000000..bc93c7ccc --- /dev/null +++ b/13-Flask/flask/getpost.py @@ -0,0 +1,37 @@ +from flask import Flask,render_template,request +''' + It creates an instance of the Flask class, + which will be your WSGI (Web Server Gateway Interface) application. +''' +###WSGI Application +app=Flask(__name__) + +@app.route("/") +def welcome(): + return "

Welcome to the flask course

" + +@app.route("/index",methods=['GET']) +def index(): + return render_template('index.html') + +@app.route('/about') +def about(): + return render_template('about.html') + +@app.route('/form',methods=['GET','POST']) +def form(): + if request.method=='POST': + name=request.form['name'] + return f'Hello {name}!' + return render_template('form.html') + +@app.route('/submit',methods=['GET','POST']) +def submit(): + if request.method=='POST': + name=request.form['name'] + return f'Hello {name}!' + return render_template('form.html') + + +if __name__=="__main__": + app.run(debug=True) \ No newline at end of file diff --git a/13-Flask/flask/jinja.py b/13-Flask/flask/jinja.py new file mode 100644 index 000000000..69dc181c3 --- /dev/null +++ b/13-Flask/flask/jinja.py @@ -0,0 +1,89 @@ +### Building Url Dynamically +## Variable Rule +### Jinja 2 Template Engine + +### Jinja2 Template Engine +''' +{{ }} expressions to print output in html +{%...%} conditions, for loops +{#...#} this is for comments +''' + +from flask import Flask,render_template,request,redirect,url_for +''' + It creates an instance of the Flask class, + which will be your WSGI (Web Server Gateway Interface) application. +''' +###WSGI Application +app=Flask(__name__) + +@app.route("/") +def welcome(): + return "

Welcome to the flask course

" + +@app.route("/index",methods=['GET']) +def index(): + return render_template('index.html') + +@app.route('/about') +def about(): + return render_template('about.html') + + + +## Variable Rule +@app.route('/success/') +def success(score): + res="" + if score>=50: + res="PASSED" + else: + res="FAILED" + + return render_template('result.html',results=res) + +## Variable Rule +@app.route('/successres/') +def successres(score): + res="" + if score>=50: + res="PASSED" + else: + res="FAILED" + + exp={'score':score,"res":res} + + return render_template('result1.html',results=exp) + +## if confition +@app.route('/sucessif/') +def successif(score): + + return render_template('result.html',results=score) + +@app.route('/fail/') +def fail(score): + return render_template('result.html',results=score) + +@app.route('/submit',methods=['POST','GET']) +def submit(): + total_score=0 + if request.method=='POST': + science=float(request.form['science']) + maths=float(request.form['maths']) + c=float(request.form['c']) + data_science=float(request.form['datascience']) + + total_score=(science+maths+c+data_science)/4 + else: + return render_template('getresult.html') + return redirect(url_for('successres',score=total_score)) + + + + + + +if __name__=="__main__": + app.run(debug=True) + diff --git a/13-Flask/flask/main.py b/13-Flask/flask/main.py new file mode 100644 index 000000000..95eb8b9db --- /dev/null +++ b/13-Flask/flask/main.py @@ -0,0 +1,23 @@ +from flask import Flask,render_template +''' + It creates an instance of the Flask class, + which will be your WSGI (Web Server Gateway Interface) application. +''' +###WSGI Application +app=Flask(__name__) + +@app.route("/") +def welcome(): + return "

Welcome to the flask course

" + +@app.route("/index") +def index(): + return render_template('index.html') + +@app.route('/about') +def about(): + return render_template('about.html') + + +if __name__=="__main__": + app.run(debug=True) \ No newline at end of file diff --git a/13-Flask/flask/sample.json b/13-Flask/flask/sample.json new file mode 100644 index 000000000..49e349fc7 --- /dev/null +++ b/13-Flask/flask/sample.json @@ -0,0 +1,3 @@ +{"name": "New Item", "description": "This is a new item"} + +{"name": "Updated Item", "description": "This item has been updated"} \ No newline at end of file diff --git a/13-Flask/flask/templates/about.html b/13-Flask/flask/templates/about.html new file mode 100644 index 000000000..ae5ed031c --- /dev/null +++ b/13-Flask/flask/templates/about.html @@ -0,0 +1,11 @@ + + + + + About + + +

About

+

This is the about page of my Flask app.

+ + diff --git a/13-Flask/flask/templates/form.html b/13-Flask/flask/templates/form.html new file mode 100644 index 000000000..cf3afa77a --- /dev/null +++ b/13-Flask/flask/templates/form.html @@ -0,0 +1,15 @@ + + + + + Form + + +

Submit a Form

+
+ + + +
+ + diff --git a/13-Flask/flask/templates/getresult.html b/13-Flask/flask/templates/getresult.html new file mode 100644 index 000000000..f0f1c22ff --- /dev/null +++ b/13-Flask/flask/templates/getresult.html @@ -0,0 +1,29 @@ + + + + + + + + + +

HTML Forms

+ +
+
+
+
+

+
+

+
+

+ +
+ +

If you click the "Submit" button, the form-data will be sent to a page called "/submit".

+ + + \ No newline at end of file diff --git a/13-Flask/flask/templates/index.html b/13-Flask/flask/templates/index.html new file mode 100644 index 000000000..afa676dfd --- /dev/null +++ b/13-Flask/flask/templates/index.html @@ -0,0 +1,11 @@ + + + + + Flask App + + +

Welcome to My Flask App!

+

This is a simple web application built with Flask.

+ + diff --git a/13-Flask/flask/templates/result.html b/13-Flask/flask/templates/result.html new file mode 100644 index 000000000..0143b8a1f --- /dev/null +++ b/13-Flask/flask/templates/result.html @@ -0,0 +1,11 @@ +

+ + Based on the marks You have {{ results }} + + {% if results>=50 %} +

You have passed with marks {{results}}

+ {% else %} +

You have failed with marks {{results}}

+ {% endif %} + + \ No newline at end of file diff --git a/13-Flask/flask/templates/result1.html b/13-Flask/flask/templates/result1.html new file mode 100644 index 000000000..c07f15860 --- /dev/null +++ b/13-Flask/flask/templates/result1.html @@ -0,0 +1,19 @@ + +

+ Final Results +

+ + + + {% for key,value in results.items() %} + + {# This is the comment section #} +

{{ key }}

+

{{ value }}

+ + + {% endfor %} + + + + \ No newline at end of file From a67334dea861d0949b67c4f507ccc6896ebb8daf Mon Sep 17 00:00:00 2001 From: Krish C Naik Date: Tue, 25 Jun 2024 12:21:16 +0530 Subject: [PATCH 2/3] Add files via upload --- 14-Streamlit/app.py | 29 + 14-Streamlit/classification.py | 32 + 14-Streamlit/sampledata.csv | 5 + 14-Streamlit/streamlit.ipynb | 140 +++ 14-Streamlit/widgets.py | 37 + 15-Memory Management/memory_manage.ipynb | 1119 ++++++++++++++++++++++ requirements.txt | 9 +- 7 files changed, 1370 insertions(+), 1 deletion(-) create mode 100644 14-Streamlit/app.py create mode 100644 14-Streamlit/classification.py create mode 100644 14-Streamlit/sampledata.csv create mode 100644 14-Streamlit/streamlit.ipynb create mode 100644 14-Streamlit/widgets.py create mode 100644 15-Memory Management/memory_manage.ipynb diff --git a/14-Streamlit/app.py b/14-Streamlit/app.py new file mode 100644 index 000000000..98b29a209 --- /dev/null +++ b/14-Streamlit/app.py @@ -0,0 +1,29 @@ +import streamlit as st +import pandas as pd +import numpy as np + +## Title of the aplication +st.title("Hello Streamlit") + +## Diplay a Simple Text +st.write("This is a imple text") + +##create a simple Dataframe + +df = pd.DataFrame({ + 'first column': [1, 2, 3, 4], + 'second column': [10, 20, 30, 40] +}) + + +## Display the Dataframe +st.write("Here is the dataframe") +st.write(df) + + +##create a line chart + +chart_data=pd.DataFrame( + np.random.randn(20,3),columns=['a','b','c'] +) +st.line_chart(chart_data) \ No newline at end of file diff --git a/14-Streamlit/classification.py b/14-Streamlit/classification.py new file mode 100644 index 000000000..77a9c7203 --- /dev/null +++ b/14-Streamlit/classification.py @@ -0,0 +1,32 @@ +import streamlit as st +import pandas as pd +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier + +@st.cache_data +def load_data(): + iris = load_iris() + df = pd.DataFrame(iris.data, columns=iris.feature_names) + df['species'] = iris.target + return df, iris.target_names + +df,target_names=load_data() + +model=RandomForestClassifier() +model.fit(df.iloc[:,:-1],df['species']) + +st.sidebar.title("Input Features") +sepal_length = st.sidebar.slider("Sepal length", float(df['sepal length (cm)'].min()), float(df['sepal length (cm)'].max())) +sepal_width = st.sidebar.slider("Sepal width", float(df['sepal width (cm)'].min()), float(df['sepal width (cm)'].max())) +petal_length = st.sidebar.slider("Petal length", float(df['petal length (cm)'].min()), float(df['petal length (cm)'].max())) +petal_width = st.sidebar.slider("Petal width", float(df['petal width (cm)'].min()), float(df['petal width (cm)'].max())) + +input_data = [[sepal_length, sepal_width, petal_length, petal_width]] + +## PRediction +prediction = model.predict(input_data) +predicted_species = target_names[prediction[0]] + +st.write("Prediction") +st.write(f"The predicted species is: {predicted_species}") + diff --git a/14-Streamlit/sampledata.csv b/14-Streamlit/sampledata.csv new file mode 100644 index 000000000..a43ecda13 --- /dev/null +++ b/14-Streamlit/sampledata.csv @@ -0,0 +1,5 @@ +,Name,Age,City +0,John,28,New York +1,Jane,24,Los Angeles +2,Jake,35,Chicago +3,Jill,40,Houston diff --git a/14-Streamlit/streamlit.ipynb b/14-Streamlit/streamlit.ipynb new file mode 100644 index 000000000..b87272155 --- /dev/null +++ b/14-Streamlit/streamlit.ipynb @@ -0,0 +1,140 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Introduction to Streamlit\n", + "Streamlit is an open-source app framework for Machine Learning and Data Science projects. It allows you to create beautiful web applications for your machine learning and data science projects with simple Python scripts." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/14-Streamlit/widgets.py b/14-Streamlit/widgets.py new file mode 100644 index 000000000..7508e7484 --- /dev/null +++ b/14-Streamlit/widgets.py @@ -0,0 +1,37 @@ +import streamlit as st +import pandas as pd + +st.title("Streamlit Text Input") + +name=st.text_input("Enter your name:") + + +age=st.slider("Select your age:",0,100,25) + +st.write(f"Your age is {age}.") + +options = ["Python", "Java", "C++", "JavaScript"] +choice = st.selectbox("Choose your favorite language:", options) +st.write(f"You selected {choice}.") + +if name: + st.write(f"Hello, {name}") + + +data = { + "Name": ["John", "Jane", "Jake", "Jill"], + "Age": [28, 24, 35, 40], + "City": ["New York", "Los Angeles", "Chicago", "Houston"] +} + +df = pd.DataFrame(data) +df.to_csv("sampledata.csv") +st.write(df) + + +uploaded_file=st.file_uploader("Choose a CSV file",type="csv") + +if uploaded_file is not None: + df=pd.read_csv(uploaded_file) + st.write(df) + diff --git a/15-Memory Management/memory_manage.ipynb b/15-Memory Management/memory_manage.ipynb new file mode 100644 index 000000000..c8a0f8d57 --- /dev/null +++ b/15-Memory Management/memory_manage.ipynb @@ -0,0 +1,1119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Python Memory Management\n", + "Memory management in Python involves a combination of automatic garbage collection, reference counting, and various internal optimizations to efficiently manage memory allocation and deallocation. Understanding these mechanisms can help developers write more efficient and robust applications.\n", + "\n", + "1. Key Concepts in Python Memory Management\n", + "2. Memory Allocation and Deallocation\n", + "3. Reference Counting\n", + "4. Garbage Collection\n", + "5. The gc Module\n", + "6. Memory Management Best Practices" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Reference Counting\n", + "Reference counting is the primary method Python uses to manage memory. Each object in Python maintains a count of references pointing to it. When the reference count drops to zero, the memory occupied by the object is deallocated." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "a=[]\n", + "## 2 (one reference from 'a' and one from getrefcount())\n", + "print(sys.getrefcount(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "b=a\n", + "print(sys.getrefcount(b))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "del b\n", + "print(sys.getrefcount(a))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Garbage Collection\n", + "Python includes a cyclic garbage collector to handle reference cycles. Reference cycles occur when objects reference each other, preventing their reference counts from reaching zero." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import gc\n", + "## enable garbage collection\n", + "gc.enable()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "gc.disable()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1036" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'collections': 182, 'collected': 1611, 'uncollectable': 0}, {'collections': 16, 'collected': 255, 'uncollectable': 0}, {'collections': 2, 'collected': 1036, 'uncollectable': 0}]\n" + ] + } + ], + "source": [ + "### Get garbage collection stats\n", + "print(gc.get_stats())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "### get unreachable objects\n", + "print(gc.garbage)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Memory Management Best Practices\n", + "1. Use Local Variables: Local variables have a shorter lifespan and are freed sooner than global variables.\n", + "2. Avoid Circular References: Circular references can lead to memory leaks if not properly managed.\n", + "3. Use Generators: Generators produce items one at a time and only keep one item in memory at a time, making them memory efficient.\n", + "4. Explicitly Delete Objects: Use the del statement to delete variables and objects explicitly.\n", + "5. Profile Memory Usage: Use memory profiling tools like tracemalloc and memory_profiler to identify memory leaks and optimize memory usage." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Object obj1 created\n", + "Object obj2 created\n", + "Object obj1 deleted\n", + "Object obj2 deleted\n", + "Object obj1 deleted\n", + "Object obj2 deleted\n", + "Object obj1 deleted\n", + "Object obj2 deleted\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable <_ctypes.PyCArrayType 0x00000205D597D480>\n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable <_ctypes.PyCArrayType 0x00000205D597B1A0>\n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n", + "gc: collectable \n" + ] + }, + { + "data": { + "text/plain": [ + "592" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Handled Circular reference\n", + "import gc\n", + "\n", + "class MyObject:\n", + " def __init__(self, name):\n", + " self.name = name\n", + " print(f\"Object {self.name} created\")\n", + "\n", + " def __del__(self):\n", + " print(f\"Object {self.name} deleted\")\n", + "\n", + "# Create circular reference\n", + "obj1 = MyObject(\"obj1\")\n", + "obj2 = MyObject(\"obj2\")\n", + "obj1.ref = obj2\n", + "obj2.ref = obj1\n", + "\n", + "del obj1\n", + "del obj2\n", + "\n", + "## Manually trigger the garbage collection\n", + "gc.collect()\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "11\n" + ] + } + ], + "source": [ + "## Generators For Memory Efficiency\n", + "#Generators allow you to produce items one at a time, using memory efficiently by only keeping one item in memory at a time.\n", + "\n", + "def generate_numbers(n):\n", + " for i in range(n):\n", + " yield i\n", + "\n", + "## using the generator\n", + "for num in generate_numbers(100000):\n", + " print(num)\n", + " if num>10:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "## Profiling Memory USage with tracemalloc\n", + "import tracemalloc\n", + "\n", + "def create_list():\n", + " return [i for i in range(10000)]\n", + "\n", + "def main():\n", + " tracemalloc.start()\n", + " \n", + " create_list()\n", + " \n", + " snapshot = tracemalloc.take_snapshot()\n", + " top_stats = snapshot.statistics('lineno')\n", + " \n", + " print(\"[ Top 10 ]\")\n", + " for stat in top_stats[::]:\n", + " print(stat)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ Top 10 ]\n", + "e:\\UDemy Final\\python\\venv\\Lib\\selectors.py:314: size=144 KiB, count=3, average=48.0 KiB\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\compilerop.py:174: size=11.2 KiB, count=122, average=94 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\builtin_trap.py:70: size=6512 B, count=1, average=6512 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\json\\decoder.py:353: size=5812 B, count=92, average=63 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:272: size=3800 B, count=10, average=380 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\codeop.py:118: size=3509 B, count=47, average=75 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\attrsettr.py:45: size=3431 B, count=73, average=47 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\compilerop.py:86: size=3395 B, count=52, average=65 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\traitlets\\traitlets.py:731: size=2883 B, count=46, average=63 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\jsonutil.py:111: size=2050 B, count=41, average=50 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\traitlets\\traitlets.py:1543: size=2031 B, count=33, average=62 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\jsonutil.py:75: size=1456 B, count=7, average=208 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\re\\_compiler.py:759: size=1360 B, count=5, average=272 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:346: size=1328 B, count=16, average=83 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\traitlets\\traitlets.py:1514: size=1320 B, count=11, average=120 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:1057: size=1276 B, count=11, average=116 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:100: size=1243 B, count=8, average=155 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\socket.py:369: size=1152 B, count=5, average=230 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\socket.py:809: size=1056 B, count=6, average=176 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:568: size=864 B, count=16, average=54 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:917: size=800 B, count=20, average=40 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:276: size=776 B, count=8, average=97 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\compiler.py:91: size=726 B, count=7, average=104 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\events.py:84: size=648 B, count=6, average=108 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\_weakrefset.py:88: size=640 B, count=8, average=80 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:1349: size=640 B, count=4, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:287: size=632 B, count=7, average=90 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:154: size=568 B, count=1, average=568 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3104: size=520 B, count=4, average=130 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:1027: size=480 B, count=8, average=60 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:782: size=440 B, count=2, average=220 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:775: size=424 B, count=2, average=212 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:836: size=416 B, count=6, average=69 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\context.py:354: size=416 B, count=4, average=104 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:790: size=416 B, count=1, average=416 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:789: size=416 B, count=1, average=416 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\fnmatch.py:46: size=400 B, count=5, average=80 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:783: size=393 B, count=1, average=393 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3334: size=376 B, count=1, average=376 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:262: size=360 B, count=5, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:261: size=360 B, count=5, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:362: size=360 B, count=1, average=360 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:269: size=344 B, count=3, average=115 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\dateutil\\parser\\_parser.py:1195: size=336 B, count=7, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:912: size=320 B, count=8, average=40 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3566: size=320 B, count=5, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\base_events.py:792: size=312 B, count=3, average=104 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:527: size=304 B, count=4, average=76 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3517: size=296 B, count=1, average=296 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\tornado\\queues.py:248: size=288 B, count=2, average=144 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\base_events.py:427: size=288 B, count=2, average=144 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:142: size=288 B, count=1, average=288 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\fnmatch.py:185: size=280 B, count=5, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\fnmatch.py:52: size=280 B, count=5, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:534: size=264 B, count=1, average=264 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:435: size=248 B, count=1, average=248 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:121: size=248 B, count=1, average=248 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:894: size=244 B, count=4, average=61 B\n", + ":66: size=240 B, count=5, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\socket.py:806: size=240 B, count=3, average=80 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\logging\\__init__.py:1622: size=240 B, count=1, average=240 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\3835544042.py:7: size=232 B, count=2, average=116 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\3835544042.py:4: size=232 B, count=2, average=116 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:545: size=232 B, count=1, average=232 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\zmqshell.py:549: size=224 B, count=3, average=75 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\compilerop.py:171: size=216 B, count=3, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3223: size=208 B, count=4, average=52 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\tornado\\platform\\asyncio.py:235: size=208 B, count=3, average=69 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\811388706.py:22: size=208 B, count=2, average=104 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\3581627739.py:22: size=208 B, count=2, average=104 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\2565588716.py:22: size=208 B, count=2, average=104 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\2547200138.py:22: size=208 B, count=2, average=104 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:1085: size=208 B, count=1, average=208 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:770: size=208 B, count=1, average=208 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\futures.py:418: size=200 B, count=5, average=40 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:688: size=194 B, count=2, average=97 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:750: size=192 B, count=2, average=96 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3224: size=176 B, count=4, average=44 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:1182: size=173 B, count=2, average=86 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\compilerop.py:172: size=168 B, count=6, average=28 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:969: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:570: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3577: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3493: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3237: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\futures.py:394: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\futures.py:387: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\futures.py:381: size=160 B, count=1, average=160 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:722: size=144 B, count=2, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\async_helpers.py:151: size=142 B, count=3, average=47 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:1016: size=140 B, count=5, average=28 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3509: size=128 B, count=3, average=43 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\jsonutil.py:73: size=128 B, count=2, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:121: size=120 B, count=2, average=60 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\traitlets\\traitlets.py:1540: size=120 B, count=2, average=60 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:318: size=120 B, count=2, average=60 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\eventloop\\zmqstream.py:652: size=120 B, count=1, average=120 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\inspect.py:265: size=120 B, count=1, average=120 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\base_events.py:755: size=120 B, count=1, average=120 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:1020: size=112 B, count=4, average=28 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:770: size=112 B, count=4, average=28 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:989: size=111 B, count=2, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\socket.py:755: size=96 B, count=2, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3375: size=96 B, count=2, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\warnings.py:189: size=96 B, count=1, average=96 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:805: size=90 B, count=2, average=45 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:996: size=88 B, count=2, average=44 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:551: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:528: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:477: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:420: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:312: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:225: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:220: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:215: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:212: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:203: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:187: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:172: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:155: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:151: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:147: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:66: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:52: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:37: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tracemalloc.py:13: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:271: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\threading.py:267: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:851: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:837: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:834: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\json\\encoder.py:224: size=72 B, count=1, average=72 B\n", + "C:\\Users\\win10\\AppData\\Local\\Temp\\ipykernel_37980\\451043146.py:0: size=72 B, count=1, average=72 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\base_events.py:1935: size=64 B, count=2, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\socket.py:810: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\eventloop\\zmqstream.py:640: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\eventloop\\zmqstream.py:561: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:1053: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:721: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\kernelbase.py:69: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:384: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:383: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:381: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:294: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\ipkernel.py:291: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\decorator.py:232: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3303: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3300: size=64 B, count=1, average=64 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\tokenize.py:537: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\traitlets\\traitlets.py:1534: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:1088: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:738: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3498: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:866: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\completer.py:1120: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\selectors.py:323: size=56 B, count=1, average=56 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:200: size=48 B, count=1, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3505: size=48 B, count=1, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:835: size=48 B, count=1, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\concurrent\\futures\\_base.py:330: size=48 B, count=1, average=48 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\zmq\\sugar\\attrsettr.py:29: size=47 B, count=1, average=47 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\prefilter.py:317: size=47 B, count=1, average=47 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\jupyter_client\\session.py:603: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:637: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\ipykernel\\iostream.py:168: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3503: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\history.py:793: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\completer.py:2813: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\completer.py:881: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\compilerop.py:192: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\concurrent\\futures\\_base.py:421: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\asyncio\\base_events.py:758: size=32 B, count=1, average=32 B\n", + "e:\\UDemy Final\\python\\venv\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:3485: size=8 B, count=1, average=8 B\n" + ] + } + ], + "source": [ + "main()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/requirements.txt b/requirements.txt index 24ca97ad3..07b0ec227 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,9 @@ ipykernel -numpy \ No newline at end of file +numpy +pandas +matplotlib +seaborn +flask +memory_profiler +streamlit +scikit-learn From cb4a197385cc5f997d03b8b3f3a65bd3b1e89f63 Mon Sep 17 00:00:00 2001 From: Krish C Naik Date: Wed, 26 Jun 2024 14:57:55 +0530 Subject: [PATCH 3/3] Add files via upload --- .../advance_multi_processing.py | 17 +++++++ .../advance_multi_threading.py | 16 +++++++ .../factorial_multi_processing.py | 40 ++++++++++++++++ .../multi_processing.py | 35 ++++++++++++++ .../multi_threading.py | 33 +++++++++++++ .../webscrapping_multi_threading.py | 48 +++++++++++++++++++ 6 files changed, 189 insertions(+) create mode 100644 16-Multithreading and Multiprocessing/advance_multi_processing.py create mode 100644 16-Multithreading and Multiprocessing/advance_multi_threading.py create mode 100644 16-Multithreading and Multiprocessing/factorial_multi_processing.py create mode 100644 16-Multithreading and Multiprocessing/multi_processing.py create mode 100644 16-Multithreading and Multiprocessing/multi_threading.py create mode 100644 16-Multithreading and Multiprocessing/webscrapping_multi_threading.py diff --git a/16-Multithreading and Multiprocessing/advance_multi_processing.py b/16-Multithreading and Multiprocessing/advance_multi_processing.py new file mode 100644 index 000000000..2544a09b9 --- /dev/null +++ b/16-Multithreading and Multiprocessing/advance_multi_processing.py @@ -0,0 +1,17 @@ +### Multiprocessing with ProcessPoolExecutor + +from concurrent.futures import ProcessPoolExecutor +import time + +def square_number(number): + time.sleep(2) + return f"Square: {number * number}" + +numbers=[1,2,3,4,5,6,7,8,9,11,2,3,12,14] +if __name__=="__main__": + + with ProcessPoolExecutor(max_workers=3) as executor: + results=executor.map(square_number,numbers) + + for result in results: + print(result) \ No newline at end of file diff --git a/16-Multithreading and Multiprocessing/advance_multi_threading.py b/16-Multithreading and Multiprocessing/advance_multi_threading.py new file mode 100644 index 000000000..89ca2eec3 --- /dev/null +++ b/16-Multithreading and Multiprocessing/advance_multi_threading.py @@ -0,0 +1,16 @@ +### Multithreading With Thread Pool Executor + +from concurrent.futures import ThreadPoolExecutor +import time + +def print_number(number): + time.sleep(1) + return f"Number :{number}" + +numbers=[1,2,3,4,5,6,7,8,9,0,1,2,3] + +with ThreadPoolExecutor(max_workers=3) as executor: + results=executor.map(print_number,numbers) + +for result in results: + print(result) \ No newline at end of file diff --git a/16-Multithreading and Multiprocessing/factorial_multi_processing.py b/16-Multithreading and Multiprocessing/factorial_multi_processing.py new file mode 100644 index 000000000..c4b1548d4 --- /dev/null +++ b/16-Multithreading and Multiprocessing/factorial_multi_processing.py @@ -0,0 +1,40 @@ +''' +Real-World Example: Multiprocessing for CPU-bound Tasks +Scenario: Factorial Calculation +Factorial calculations, especially for large numbers, +involve significant computational work. Multiprocessing +can be used to distribute the workload across multiple +CPU cores, improving performance. + +''' + +import multiprocessing +import math +import sys +import time + +# Increase the maximum number of digits for integer conversion +sys.set_int_max_str_digits(100000) + +## function to compute factorials of a given number + +def computer_factorial(number): + print(f"Computing factorial of {number}") + result=math.factorial(number) + print(f"Factorial of {number} is {result}") + return result + +if __name__=="__main__": + numbers=[5000,6000,700,8000] + + start_time=time.time() + + ##create a pool of worker processes + with multiprocessing.Pool() as pool: + results=pool.map(computer_factorial,numbers) + + end_time=time.time() + + print(f"Results: {results}") + print(f"Time taken: {end_time - start_time} seconds") + diff --git a/16-Multithreading and Multiprocessing/multi_processing.py b/16-Multithreading and Multiprocessing/multi_processing.py new file mode 100644 index 000000000..70f4957a2 --- /dev/null +++ b/16-Multithreading and Multiprocessing/multi_processing.py @@ -0,0 +1,35 @@ +## PRocesses that run in parallel +### CPU-Bound Tasks-Tasks that are heavy on CPU usage (e.g., mathematical computations, data processing). +## PArallel execution- Multiple cores of the CPU + +import multiprocessing + +import time + +def square_numbers(): + for i in range(5): + time.sleep(1) + print(f"Square: {i*i}") + +def cube_numbers(): + for i in range(5): + time.sleep(1.5) + print(f"Cube: {i * i * i}") + +if __name__=="__main__": + + ## create 2 processes + p1=multiprocessing.Process(target=square_numbers) + p2=multiprocessing.Process(target=cube_numbers) + t=time.time() + + ## start the process + p1.start() + p2.start() + + ## Wait for the process to complete + p1.join() + p2.join() + + finished_time=time.time()-t + print(finished_time) \ No newline at end of file diff --git a/16-Multithreading and Multiprocessing/multi_threading.py b/16-Multithreading and Multiprocessing/multi_threading.py new file mode 100644 index 000000000..4f2ca6550 --- /dev/null +++ b/16-Multithreading and Multiprocessing/multi_threading.py @@ -0,0 +1,33 @@ +### Multithreading +## When to use Multi Threading +###I/O-bound tasks: Tasks that spend more time waiting for I/O operations (e.g., file operations, network requests). +### Concurrent execution: When you want to improve the throughput of your application by performing multiple operations concurrently. + +import threading +import time + +def print_numbers(): + for i in range(5): + time.sleep(2) + print(f"Number:{i}") + +def print_letter(): + for letter in "abcde": + time.sleep(2) + print(f"Letter: {letter}") + +##create 2 threads +t1=threading.Thread(target=print_numbers) +t2=threading.Thread(target=print_letter) + +t=time.time() +## start the thread +t1.start() +t2.start() + +### Wait for the threads to complete +t1.join() +t2.join() + +finished_time=time.time()-t +print(finished_time) \ No newline at end of file diff --git a/16-Multithreading and Multiprocessing/webscrapping_multi_threading.py b/16-Multithreading and Multiprocessing/webscrapping_multi_threading.py new file mode 100644 index 000000000..06eca14bc --- /dev/null +++ b/16-Multithreading and Multiprocessing/webscrapping_multi_threading.py @@ -0,0 +1,48 @@ +''' +Real-World Example: Multithreading for I/O-bound Tasks +Scenario: Web Scraping +Web scraping often involves making numerous network requests to +fetch web pages. These tasks are I/O-bound because they spend a lot of +time waiting for responses from servers. Multithreading can significantly +improve the performance by allowing multiple web pages to be fetched concurrently. + +''' + +''' + +https://python.langchain.com/v0.2/docs/introduction/ + +https://python.langchain.com/v0.2/docs/concepts/ + +https://python.langchain.com/v0.2/docs/tutorials/ +''' + +import threading +import requests +from bs4 import BeautifulSoup + +urls=[ +'https://python.langchain.com/v0.2/docs/introduction/', + +'https://python.langchain.com/v0.2/docs/concepts/', + +'https://python.langchain.com/v0.2/docs/tutorials/' + +] + +def fetch_content(url): + response=requests.get(url) + soup=BeautifulSoup(response.content,'html.parser') + print(f'Fetched {len(soup.text)} characters from {url}') + +threads=[] + +for url in urls: + thread=threading.Thread(target=fetch_content,args=(url,)) + threads.append(thread) + thread.start() + +for thread in threads: + thread.join() + +print("All web pages fetched") \ No newline at end of file