Working through the single responsibility principle (SRP) in Python when calls are expensive ...
Solving overdetermined system by QR decomposition
Why are PDP-7-style microprogrammed instructions out of vogue?
Word for: a synonym with a positive connotation?
number sequence puzzle deep six
Drawing vertical/oblique lines in Metrical tree (tikz-qtree, tipa)
Why can't devices on different VLANs, but on the same subnet, communicate?
60's-70's movie: home appliances revolting against the owners
Why doesn't shell automatically fix "useless use of cat"?
Word to describe a time interval
What does Linus Torvalds mean when he says that Git "never ever" tracks a file?
Pretty sure I'm over complicating my loops but unsure how to simplify
For what reasons would an animal species NOT cross a *horizontal* land bridge?
Is there a way to generate uniformly distributed points on a sphere from a fixed amount of random real numbers per point?
Can I visit the Trinity College (Cambridge) library and see some of their rare books
Does Parliament hold absolute power in the UK?
TDS update packages don't remove unneeded items
Is 'stolen' appropriate word?
Do warforged have souls?
How do spell lists change if the party levels up without taking a long rest?
How to substitute curly brackets with round brackets in a grid of list
Why doesn't a hydraulic lever violate conservation of energy?
How to make Illustrator type tool selection automatically adapt with text length
Was credit for the black hole image misappropriated?
Why did Peik Lin say, "I'm not an animal"?
Working through the single responsibility principle (SRP) in Python when calls are expensive
The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
2019 Community Moderator Election Results
Can we improve our style of self-moderation for not-too-bad questions?Is micro-optimisation important when coding?Single Responsibility Principle ImplementationSomething confusing about Single Responsibility PrincipleSingle Responsibility Principle: Responsibility unknownObject oriented vs vector based programmingWhen using the Single Responsibility Principle, what constitutes a “responsibility?”Single Responsibility Principle Violation?Does Template pattern violate Single Responsibility principle?Single responsibility principle - importerApplicability of Single Responsibility PrincipleProblem understanding the Single Responsibility Principle
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
Some base points:
Python method calls are "expensive" due to its interpreted nature. In theory, if your code is simple enough, breaking down Python code has negative impact besides readability and reuse (which is a big gain for developers, not so much for users).- The single responsibility principle (SRP) keeps code readable, is easier to test and maintain.
- The project has a special kind of background where we want readable code, tests, and time performance.
For instance, code like this which invokes several methods (x4) is slower than the following one which is just one.
from operator import add
class Vector:
def __init__(self,list_of_3):
self.coordinates = list_of_3
def move(self,movement):
self.coordinates = list( map(add, self.coordinates, movement))
return self.coordinates
def revert(self):
self.coordinates = self.coordinates[::-1]
return self.coordinates
def get_coordinates(self):
return self.coordinates
## Operation with one vector
vec3 = Vector([1,2,3])
vec3.move([1,1,1])
vec3.revert()
vec3.get_coordinates()
In comparison to this:
from operator import add
def move_and_revert_and_return(vector,movement):
return list( map(add, vector, movement) )[::-1]
move_and_revert_and_return([1,2,3],[1,1,1])
If I am to parallelize something such as that, it is pretty objective I lose performance. Mind that is just an example; my project has several mini routines with math such as that - While it is much easier to work with, our profilers are disliking it.
How and where do we embrace the SRP without compromising performance in Python, as its inherent implementation directly impacts it?
Are there workarounds, like some sort of pre-processor that puts things in-line for release?
Or is Python simply poor at handling code breakdown altogether?
python performance single-responsibility methods
|
show 1 more comment
Some base points:
Python method calls are "expensive" due to its interpreted nature. In theory, if your code is simple enough, breaking down Python code has negative impact besides readability and reuse (which is a big gain for developers, not so much for users).- The single responsibility principle (SRP) keeps code readable, is easier to test and maintain.
- The project has a special kind of background where we want readable code, tests, and time performance.
For instance, code like this which invokes several methods (x4) is slower than the following one which is just one.
from operator import add
class Vector:
def __init__(self,list_of_3):
self.coordinates = list_of_3
def move(self,movement):
self.coordinates = list( map(add, self.coordinates, movement))
return self.coordinates
def revert(self):
self.coordinates = self.coordinates[::-1]
return self.coordinates
def get_coordinates(self):
return self.coordinates
## Operation with one vector
vec3 = Vector([1,2,3])
vec3.move([1,1,1])
vec3.revert()
vec3.get_coordinates()
In comparison to this:
from operator import add
def move_and_revert_and_return(vector,movement):
return list( map(add, vector, movement) )[::-1]
move_and_revert_and_return([1,2,3],[1,1,1])
If I am to parallelize something such as that, it is pretty objective I lose performance. Mind that is just an example; my project has several mini routines with math such as that - While it is much easier to work with, our profilers are disliking it.
How and where do we embrace the SRP without compromising performance in Python, as its inherent implementation directly impacts it?
Are there workarounds, like some sort of pre-processor that puts things in-line for release?
Or is Python simply poor at handling code breakdown altogether?
python performance single-responsibility methods
2
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
10
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago
|
show 1 more comment
Some base points:
Python method calls are "expensive" due to its interpreted nature. In theory, if your code is simple enough, breaking down Python code has negative impact besides readability and reuse (which is a big gain for developers, not so much for users).- The single responsibility principle (SRP) keeps code readable, is easier to test and maintain.
- The project has a special kind of background where we want readable code, tests, and time performance.
For instance, code like this which invokes several methods (x4) is slower than the following one which is just one.
from operator import add
class Vector:
def __init__(self,list_of_3):
self.coordinates = list_of_3
def move(self,movement):
self.coordinates = list( map(add, self.coordinates, movement))
return self.coordinates
def revert(self):
self.coordinates = self.coordinates[::-1]
return self.coordinates
def get_coordinates(self):
return self.coordinates
## Operation with one vector
vec3 = Vector([1,2,3])
vec3.move([1,1,1])
vec3.revert()
vec3.get_coordinates()
In comparison to this:
from operator import add
def move_and_revert_and_return(vector,movement):
return list( map(add, vector, movement) )[::-1]
move_and_revert_and_return([1,2,3],[1,1,1])
If I am to parallelize something such as that, it is pretty objective I lose performance. Mind that is just an example; my project has several mini routines with math such as that - While it is much easier to work with, our profilers are disliking it.
How and where do we embrace the SRP without compromising performance in Python, as its inherent implementation directly impacts it?
Are there workarounds, like some sort of pre-processor that puts things in-line for release?
Or is Python simply poor at handling code breakdown altogether?
python performance single-responsibility methods
Some base points:
Python method calls are "expensive" due to its interpreted nature. In theory, if your code is simple enough, breaking down Python code has negative impact besides readability and reuse (which is a big gain for developers, not so much for users).- The single responsibility principle (SRP) keeps code readable, is easier to test and maintain.
- The project has a special kind of background where we want readable code, tests, and time performance.
For instance, code like this which invokes several methods (x4) is slower than the following one which is just one.
from operator import add
class Vector:
def __init__(self,list_of_3):
self.coordinates = list_of_3
def move(self,movement):
self.coordinates = list( map(add, self.coordinates, movement))
return self.coordinates
def revert(self):
self.coordinates = self.coordinates[::-1]
return self.coordinates
def get_coordinates(self):
return self.coordinates
## Operation with one vector
vec3 = Vector([1,2,3])
vec3.move([1,1,1])
vec3.revert()
vec3.get_coordinates()
In comparison to this:
from operator import add
def move_and_revert_and_return(vector,movement):
return list( map(add, vector, movement) )[::-1]
move_and_revert_and_return([1,2,3],[1,1,1])
If I am to parallelize something such as that, it is pretty objective I lose performance. Mind that is just an example; my project has several mini routines with math such as that - While it is much easier to work with, our profilers are disliking it.
How and where do we embrace the SRP without compromising performance in Python, as its inherent implementation directly impacts it?
Are there workarounds, like some sort of pre-processor that puts things in-line for release?
Or is Python simply poor at handling code breakdown altogether?
python performance single-responsibility methods
python performance single-responsibility methods
edited 13 mins ago
Peter Mortensen
1,11521114
1,11521114
asked 7 hours ago
lucasgcblucasgcb
13316
13316
2
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
10
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago
|
show 1 more comment
2
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
10
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago
2
2
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
10
10
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago
|
show 1 more comment
2 Answers
2
active
oldest
votes
is Python simply poor at handling code breakdown altogether?
Unfortunately yes, Python is slow and there are many anecdotes about people drastically increasing performance by inlining functions and making their code ugly.
There is a work around, Cython, which is a compiled version of Python and much faster.
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
add a comment |
Many potential performance concerns are not really a problem in practice. The issue you raise may be one of them. In the vernacular, we call worrying about those problems without proof that they are actual problems premature optimization.
If you are writing a front-end for a web service, your performance is not going to be significantly affected by function calls, because the cost of sending data over a network far exceeds the time it takes to make a method call.
If you are writing a tight loop that refreshes a video screen sixty times a second, then it might matter. But at that point, I claim you have larger problems if you're trying to use Python to do that, a job for which Python is probably not well-suited.
As always, the way you find out is to measure. Run a performance profiler or some timers over your code. See if it's a real problem in practice.
The Single Responsibility Principle is not a law or mandate; it is a guideline or principle. Software design is always about trade-offs; there are no absolutes. It is not uncommon to trade off readability and/or maintainability for speed, so you may have to sacrifice SRP on the altar of performance. But don't make that tradeoff unless you know you have a performance problem.
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
your AWS bills are very low indeed
– Ewan
4 hours ago
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
|
show 5 more comments
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "131"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f390266%2fworking-through-the-single-responsibility-principle-srp-in-python-when-calls-a%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
is Python simply poor at handling code breakdown altogether?
Unfortunately yes, Python is slow and there are many anecdotes about people drastically increasing performance by inlining functions and making their code ugly.
There is a work around, Cython, which is a compiled version of Python and much faster.
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
add a comment |
is Python simply poor at handling code breakdown altogether?
Unfortunately yes, Python is slow and there are many anecdotes about people drastically increasing performance by inlining functions and making their code ugly.
There is a work around, Cython, which is a compiled version of Python and much faster.
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
add a comment |
is Python simply poor at handling code breakdown altogether?
Unfortunately yes, Python is slow and there are many anecdotes about people drastically increasing performance by inlining functions and making their code ugly.
There is a work around, Cython, which is a compiled version of Python and much faster.
is Python simply poor at handling code breakdown altogether?
Unfortunately yes, Python is slow and there are many anecdotes about people drastically increasing performance by inlining functions and making their code ugly.
There is a work around, Cython, which is a compiled version of Python and much faster.
edited 3 hours ago
lucasgcb
13316
13316
answered 6 hours ago
EwanEwan
43.8k33698
43.8k33698
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
add a comment |
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
While Robert's Answer helps cover some bases for potential misunderstandings behind doing this sort of optimization (which fits this question ), I feel this answers the situation a bit more directly and in-line with the Python context.
– lucasgcb
4 hours ago
1
1
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
sorry its somewhat short. I don't have time to write more. But I do think Robert is wrong on this one. The best advice with python seems to be to profile as you code. Dont assume it will be performant and only optimise if you find a problem
– Ewan
4 hours ago
1
1
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
@Ewan: You don't have to write the entire program first to follow my advice. A method or two is more than sufficient to get adequate profiling.
– Robert Harvey♦
2 hours ago
1
1
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
you can also try pypy, which is a JITted python
– Eevee
1 hour ago
add a comment |
Many potential performance concerns are not really a problem in practice. The issue you raise may be one of them. In the vernacular, we call worrying about those problems without proof that they are actual problems premature optimization.
If you are writing a front-end for a web service, your performance is not going to be significantly affected by function calls, because the cost of sending data over a network far exceeds the time it takes to make a method call.
If you are writing a tight loop that refreshes a video screen sixty times a second, then it might matter. But at that point, I claim you have larger problems if you're trying to use Python to do that, a job for which Python is probably not well-suited.
As always, the way you find out is to measure. Run a performance profiler or some timers over your code. See if it's a real problem in practice.
The Single Responsibility Principle is not a law or mandate; it is a guideline or principle. Software design is always about trade-offs; there are no absolutes. It is not uncommon to trade off readability and/or maintainability for speed, so you may have to sacrifice SRP on the altar of performance. But don't make that tradeoff unless you know you have a performance problem.
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
your AWS bills are very low indeed
– Ewan
4 hours ago
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
|
show 5 more comments
Many potential performance concerns are not really a problem in practice. The issue you raise may be one of them. In the vernacular, we call worrying about those problems without proof that they are actual problems premature optimization.
If you are writing a front-end for a web service, your performance is not going to be significantly affected by function calls, because the cost of sending data over a network far exceeds the time it takes to make a method call.
If you are writing a tight loop that refreshes a video screen sixty times a second, then it might matter. But at that point, I claim you have larger problems if you're trying to use Python to do that, a job for which Python is probably not well-suited.
As always, the way you find out is to measure. Run a performance profiler or some timers over your code. See if it's a real problem in practice.
The Single Responsibility Principle is not a law or mandate; it is a guideline or principle. Software design is always about trade-offs; there are no absolutes. It is not uncommon to trade off readability and/or maintainability for speed, so you may have to sacrifice SRP on the altar of performance. But don't make that tradeoff unless you know you have a performance problem.
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
your AWS bills are very low indeed
– Ewan
4 hours ago
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
|
show 5 more comments
Many potential performance concerns are not really a problem in practice. The issue you raise may be one of them. In the vernacular, we call worrying about those problems without proof that they are actual problems premature optimization.
If you are writing a front-end for a web service, your performance is not going to be significantly affected by function calls, because the cost of sending data over a network far exceeds the time it takes to make a method call.
If you are writing a tight loop that refreshes a video screen sixty times a second, then it might matter. But at that point, I claim you have larger problems if you're trying to use Python to do that, a job for which Python is probably not well-suited.
As always, the way you find out is to measure. Run a performance profiler or some timers over your code. See if it's a real problem in practice.
The Single Responsibility Principle is not a law or mandate; it is a guideline or principle. Software design is always about trade-offs; there are no absolutes. It is not uncommon to trade off readability and/or maintainability for speed, so you may have to sacrifice SRP on the altar of performance. But don't make that tradeoff unless you know you have a performance problem.
Many potential performance concerns are not really a problem in practice. The issue you raise may be one of them. In the vernacular, we call worrying about those problems without proof that they are actual problems premature optimization.
If you are writing a front-end for a web service, your performance is not going to be significantly affected by function calls, because the cost of sending data over a network far exceeds the time it takes to make a method call.
If you are writing a tight loop that refreshes a video screen sixty times a second, then it might matter. But at that point, I claim you have larger problems if you're trying to use Python to do that, a job for which Python is probably not well-suited.
As always, the way you find out is to measure. Run a performance profiler or some timers over your code. See if it's a real problem in practice.
The Single Responsibility Principle is not a law or mandate; it is a guideline or principle. Software design is always about trade-offs; there are no absolutes. It is not uncommon to trade off readability and/or maintainability for speed, so you may have to sacrifice SRP on the altar of performance. But don't make that tradeoff unless you know you have a performance problem.
edited 4 hours ago
answered 6 hours ago
Robert Harvey♦Robert Harvey
167k43386601
167k43386601
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
your AWS bills are very low indeed
– Ewan
4 hours ago
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
|
show 5 more comments
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
your AWS bills are very low indeed
– Ewan
4 hours ago
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
2
2
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
I think this was true, until we invented cloud computing. Now one of the two functions effectively costs 4 times as much as the other
– Ewan
6 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
@Ewan 4 times may not matter until you've measured it to be significant enough to care about. If Foo takes 1 ms and Bar takes 4 ms that's not good. Until you realize that transmitting the data across the network takes 200 ms. At that point, Bar being slower doesn't matter so much. (Just one possible example of where being X times slower doesn't make a noticeable or impactful difference, not meant to be necessarily super realistic.)
– Becuzz
5 hours ago
4
4
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
@Ewan If the reduction in the bill saves you $15/month but it will take a $125/hour contractor 4 hours to fix and test it, I could easily justify that not being worth a business's time to do (or at least not do right now if time to market is crucial, etc.). There are always tradeoffs. And what makes sense in one circumstance might not in another.
– Becuzz
4 hours ago
2
2
your AWS bills are very low indeed
– Ewan
4 hours ago
your AWS bills are very low indeed
– Ewan
4 hours ago
2
2
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
@Ewan AWS rounds to the ceiling by batches anyways (standard is 100ms). Which means this kind of optimization only saves you anything if it consistently avoids pushing you to the next chunk.
– Delioth
2 hours ago
|
show 5 more comments
Thanks for contributing an answer to Software Engineering Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f390266%2fworking-through-the-single-responsibility-principle-srp-in-python-when-calls-a%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
Possible duplicate of Is micro-optimisation important when coding?
– gnat
6 hours ago
10
For what it's worth, your two code examples do not differ in number of responsibilities. The SRP is not a method counting exercise.
– Robert Harvey♦
4 hours ago
@RobertHarvey You're right, sorry for the poor example and I'll edit a better one when I have the time. In either case, readability and maintanability suffers and eventually the SRP breaks down within the codebase as we cut down on classes and their methods.
– lucasgcb
4 hours ago
note that function calls are expensive in any language, though AOT compilers have the luxury of inlining
– Eevee
1 hour ago
Does your object really have four responsibilities: move, revert, get_coordinates, and move_and_revert_and_return? or does it really only have the one responsibility, move_and_revert_and_return?
– Eric Towers
28 mins ago