from timeit import timeit from math import floor # 1. Can you implement another optimised function (sum_even_numbers2) using purely native python? # Can you timeit to show it's faster and describe why it is. # Can you also state if there are any pros or cons to how it is implemented? # 2. Can you implement another optimised function (sum_even_numbers3) using third party packages? # Can you timeit to show it's faster and describe why it is. # Can you also state if there are any pros or cons to how it is implemented? def sum_even_numbers1(numbers: list[int]) -> int: total = 0 for num in numbers: if floor(num/2) == num/2: total += num return total # Floating point calculation is not required # Only one division required # float required 32byte, memory heavy def sum_even_numbers2(numbers: list[int]) -> int: total = 0 for num in numbers: if num%2 == 0: total += num return total # needs to call that function from memory def sum_even_numbers3(numbers: list[int]) -> int: return sum(filter(lambda x: x > 0 and x%2 == 0, numbers))
- from timeit import timeit
- from math import floor
- # 1. Can you implement another optimised function (sum_even_numbers2) using purely native python?
- # Can you timeit to show it's faster and describe why it is.
- # Can you also state if there are any pros or cons to how it is implemented?
- # 2. Can you implement another optimised function (sum_even_numbers3) using third party packages?
- # Can you timeit to show it's faster and describe why it is.
- # Can you also state if there are any pros or cons to how it is implemented?
- def sum_even_numbers1(numbers: list[int]) -> int:
- total = 0
- for num in numbers:
- if floor(num/2) == num/2:
- total += num
- return total
- # Floating point calculation is not required
- # Only one division required
- # float required 32byte, memory heavy
- def sum_even_numbers2(numbers: list[int]) -> int:
- total = 0
- for num in numbers:
- if num%2 == 0:
- total += num
- return total
- # needs to call that function from memory
- def sum_even_numbers3(numbers: list[int]) -> int:
- return sum(filter(lambda x: x > 0 and x%2 == 0, numbers))
import codewars_test as test import solution # or from solution import example @test.describe("Example") def test_group(): @test.it("test case") def test_case(): iterations = 100 list_length = 100000 input_data = [i for i in range(0, list_length)] print(timeit(lambda: sum_even_numbers1(input_data), number=iterations)) print(timeit(lambda: sum_even_numbers2(input_data), number=iterations)) print(timeit(lambda: sum_even_numbers3(input_data), number=iterations))
- import codewars_test as test
- import solution # or from solution import example
- @test.describe("Example")
- def test_group():
- @test.it("test case")
- def test_case():
- iterations = 100
- list_length = 100000
- input_data = [i for i in range(0, list_length)]
print(timeit(lambda: sum_even_numbers1(input_data), number=iterations))- print(timeit(lambda: sum_even_numbers1(input_data), number=iterations))
- print(timeit(lambda: sum_even_numbers2(input_data), number=iterations))
- print(timeit(lambda: sum_even_numbers3(input_data), number=iterations))
"""Test equipment positions.""" from __future__ import annotations from collections import Counter, defaultdict import datetime as dt import math import numpy as np import pandas as pd from typing import Any def data_dict() -> defaultdict[str, Any]: """Return all equipment positions.""" d = defaultdict(list) d["T123"].append({"position": {"x": 42, "y": 24, "z": 0.42}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) d["T456"].append({"position": {"x": 21.0, "y": 34, "z": 0.289}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) d["T789"].append({"position": {"x": 17, "y": 39, "z": 0.789}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) d["T456"].append({"position": {"x": 91.0, "y": 114, "z": 0.489}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)}) d["T123"].append({"position": {"x": 43, "y": 25, "z": 0.43}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)}) d["T789"].append({"position": {"x": 19., "y": 79, "z": 0.991}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)}) d["T123"].append({"position": {"x": 46, "y": 29, "z": 0.44}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)}) d["T456"].append({"position": {"x": 24.0, "y": 37, "z": 0.297}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)}) d["T123"].append({"position": {"x": 49.0, "y": 32, "z": 0.451}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)}) d["T789"].append({"position": {"x": 23., "y": 81, "z": 1.103}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)}) return d def latest_snapshot() -> dict[str, Any]: """Return a snapshot of latest equipment.""" return { "T123": {"position": {"x": 49.0, "y": 32, "z": 0.451}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)}, "T456": {"position": {"x": 24.0, "y": 37, "z": 0.297}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)}, "T789": {"position": {"x": 23.0, "y": 81, "z": 1.103}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)}, } def counts() -> dict[str, int]: """Return counts per equipment.""" return { "T123": 4, "T456": 3, "T789": 3 } def speeds() -> defaultdict[str, Any]: """Return speeds of equipment.""" d = defaultdict(list) d["T123"].append({"speed": 4.242654947082074, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)}) d["T123"].append({"speed": 5.00000999999, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)}) d["T123"].append({"speed": 1.4142489172702237, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)}) d["T123"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) d["T456"].append({"speed": 102.0687849638664, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)}) d["T456"].append({"speed": 35.43388209045123, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)}) d["T456"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) d["T789"].append({"speed": 4.473538196997986, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)}) d["T789"].append({"speed": 6.6750796998987205, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)}) d["T789"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)}) return d def find_furthest_west(d: defaultdict) -> str: """ Find the name of the truck that is furthest west. That is, the truck with the smallest easting position component. """ latest = get_latest_snapshot(d) truck_furthest_west = "" x = latest[list(latest.keys())[0]]['position']['x'] for item in latest: if latest[item]['position']['x'] < x: x = latest[item]['position']['x'] truck_furthest_west = item return truck_furthest_west def get_latest_snapshot(d: defaultdict) -> dict[str, Any]: """ Return a snapshot of the latest positional updates for the equipment. """ temp = defaultdict(list) for item in d: df = pd.DataFrame(d[item]) temp[item] = df.iloc[-1].to_dict() return temp def get_counts(d: defaultdict) -> dict[str, int]: """Return a dict of trucks and the times they have provided updates.""" temp = defaultdict(list) for item in d: temp[item] = len(d[item]) return temp def calculate_speeds(d: defaultdict) -> defaultdict[str, Any]: """Return a dict of equipment and the speeds they are travelling at.""" df = pd.json_normalize(d, sep='_') temp = defaultdict(list) for item in d: df = pd.json_normalize(d[item], sep='_') diff = df.diff() coords = [c for c in df.columns if not 'timestamp' in c] df['speed'] = np.linalg.norm(diff[coords], axis=1)/diff['timestamp'].dt.seconds temp[item] = df[['timestamp', 'speed']] print(temp) pass
- """Test equipment positions."""
- from __future__ import annotations
- from collections import Counter, defaultdict
- import datetime as dt
- import math
- import numpy as np
- import pandas as pd
- from typing import Any
- def data_dict() -> defaultdict[str, Any]:
- """Return all equipment positions."""
- d = defaultdict(list)
- d["T123"].append({"position": {"x": 42, "y": 24, "z": 0.42}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- d["T456"].append({"position": {"x": 21.0, "y": 34, "z": 0.289}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- d["T789"].append({"position": {"x": 17, "y": 39, "z": 0.789}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- d["T456"].append({"position": {"x": 91.0, "y": 114, "z": 0.489}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
- d["T123"].append({"position": {"x": 43, "y": 25, "z": 0.43}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)})
- d["T789"].append({"position": {"x": 19., "y": 79, "z": 0.991}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)})
- d["T123"].append({"position": {"x": 46, "y": 29, "z": 0.44}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)})
- d["T456"].append({"position": {"x": 24.0, "y": 37, "z": 0.297}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)})
- d["T123"].append({"position": {"x": 49.0, "y": 32, "z": 0.451}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
- d["T789"].append({"position": {"x": 23., "y": 81, "z": 1.103}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)})
- return d
- def latest_snapshot() -> dict[str, Any]:
- """Return a snapshot of latest equipment."""
- return {
- "T123": {"position": {"x": 49.0, "y": 32, "z": 0.451}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)},
- "T456": {"position": {"x": 24.0, "y": 37, "z": 0.297}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)},
- "T789": {"position": {"x": 23.0, "y": 81, "z": 1.103}, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)},
- }
- def counts() -> dict[str, int]:
- """Return counts per equipment."""
- return {
- "T123": 4,
- "T456": 3,
- "T789": 3
- }
- def speeds() -> defaultdict[str, Any]:
- """Return speeds of equipment."""
- d = defaultdict(list)
- d["T123"].append({"speed": 4.242654947082074, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
- d["T123"].append({"speed": 5.00000999999, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)})
- d["T123"].append({"speed": 1.4142489172702237, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)})
- d["T123"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- d["T456"].append({"speed": 102.0687849638664, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)})
- d["T456"].append({"speed": 35.43388209045123, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
- d["T456"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- d["T789"].append({"speed": 4.473538196997986, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)})
- d["T789"].append({"speed": 6.6750796998987205, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)})
- d["T789"].append({"speed": None, "timestamp": dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
- return d
- def find_furthest_west(d: defaultdict) -> str:
- """
- Find the name of the truck that is furthest west. That is,
- the truck with the smallest easting position component.
- """
pass- latest = get_latest_snapshot(d)
- truck_furthest_west = ""
- x = latest[list(latest.keys())[0]]['position']['x']
- for item in latest:
- if latest[item]['position']['x'] < x:
- x = latest[item]['position']['x']
- truck_furthest_west = item
- return truck_furthest_west
- def get_latest_snapshot(d: defaultdict) -> dict[str, Any]:
- """
- Return a snapshot of the latest positional updates for the
- equipment.
- """
pass- temp = defaultdict(list)
- for item in d:
- df = pd.DataFrame(d[item])
- temp[item] = df.iloc[-1].to_dict()
- return temp
- def get_counts(d: defaultdict) -> dict[str, int]:
- """Return a dict of trucks and the times they have provided updates."""
pass- temp = defaultdict(list)
- for item in d:
- temp[item] = len(d[item])
- return temp
- def calculate_speeds(d: defaultdict) -> defaultdict[str, Any]:
- """Return a dict of equipment and the speeds they are travelling at."""
- df = pd.json_normalize(d, sep='_')
- temp = defaultdict(list)
- for item in d:
- df = pd.json_normalize(d[item], sep='_')
- diff = df.diff()
- coords = [c for c in df.columns if not 'timestamp' in c]
- df['speed'] = np.linalg.norm(diff[coords], axis=1)/diff['timestamp'].dt.seconds
- temp[item] = df[['timestamp', 'speed']]
- print(temp)
- pass